Seite 1 von 1

new und malloc

Verfasst: Di Mär 12, 2013 1:37 pm
von Glocke
Hi,

ich will X Bytes Speicher reservieren. Normalerweise geht das ja mit malloc. Allerdings muss ich den Speicher dann mit free freigeben anstatt mit delete; oder?

Kann ich mit new auch irgendwie X Bytes reservieren ohne einen konkreten Typ anzugeben? Hintergrund ist, dass ich über einen Socket erst die Anzahl der Bytes bekomme und den Speicher adressieren will. Anschließend bekomme ich die Daten und gebe sie in den reservierten Bereich hinein. Allerdings will ich das dann (als void*) zurückgeben (später in den entsprechenden Typ casten) und irgendwann mit delete freigeben - was so meinem Kenntnisstand nach nicht funktioniert.

Kann mir da jemand helfen?

LG Glocke :)

Re: new und malloc

Verfasst: Di Mär 12, 2013 2:27 pm
von nufan
Glocke hat geschrieben:Kann ich mit new auch irgendwie X Bytes reservieren ohne einen konkreten Typ anzugeben?
Kannst du, indem du den Speicherbereich einem Zeiger vom Typ void* zuweist.
Glocke hat geschrieben:Anschließend bekomme ich die Daten und gebe sie in den reservierten Bereich hinein. Allerdings will ich das dann (als void*) zurückgeben (später in den entsprechenden Typ casten) und irgendwann mit delete freigeben - was so meinem Kenntnisstand nach nicht funktioniert.
Warum verwendest du nicht einfach free()?

Re: new und malloc

Verfasst: Di Mär 12, 2013 2:55 pm
von Glocke
dani93 hat geschrieben:Kannst du, indem du den Speicherbereich einem Zeiger vom Typ void* zuweist.
Kannst du mir dazu mal nen Codebeispiel geben?
dani93 hat geschrieben:Warum verwendest du nicht einfach free()?
Naja ich hab mir angewöhnt die Pointer mit delete zu löschen weil ja ggf. noch ein Destruktur mit drinnen steckt. Bei free würde der ja nicht aufgerufen werden.

LG Glocke

Re: new und malloc

Verfasst: Di Mär 12, 2013 2:59 pm
von nufan
Glocke hat geschrieben:
dani93 hat geschrieben:Kannst du, indem du den Speicherbereich einem Zeiger vom Typ void* zuweist.
Kannst du mir dazu mal nen Codebeispiel geben?

Code: Alles auswählen

void *data = malloc(1000);
Reserviert 1000 Byte eines undefinierten Typs.
Glocke hat geschrieben:
dani93 hat geschrieben:Warum verwendest du nicht einfach free()?
Naja ich hab mir angewöhnt die Pointer mit delete zu löschen weil ja ggf. noch ein Destruktur mit drinnen steckt. Bei free würde der ja nicht aufgerufen werden.
Ich rate dir stark davon ab Klassen bzw. in C++ auch Strukturen aus einem void-Zeiger zu casten. Das geht schief, glaub mir. Schreib dir lieber einen Konstruktor der einen void-Zeiger bekommt und die entsprechenden Daten rausliest.

Re: new und malloc

Verfasst: Di Mär 12, 2013 4:39 pm
von GilbertDur
Heißt das, du willst malloc und delete verwenden? Das solltest du lassen. Entweder new und delete oder malloc und free, aber bloß nicht gemischt. Warum muss da eigentlich überhaupt ein void* und später ein cast rein bei deinem Problem? Du könntest doch ein char Array oder Pointer als Byte-Buffer verwenden.

Re: new und malloc

Verfasst: Di Mär 12, 2013 6:38 pm
von Xin
Glocke hat geschrieben:ich will X Bytes Speicher reservieren. Normalerweise geht das ja mit malloc. Allerdings muss ich den Speicher dann mit free freigeben anstatt mit delete; oder?

Kann ich mit new auch irgendwie X Bytes reservieren ohne einen konkreten Typ anzugeben? Hintergrund ist, dass ich über einen Socket erst die Anzahl der Bytes bekomme und den Speicher adressieren will.
Du kannst einfach mit 'new char[ size ]' arbeiten oder mit malloc - es kommt am Ende das gleiche raus.
Glocke hat geschrieben:Naja ich hab mir angewöhnt die Pointer mit delete zu löschen weil ja ggf. noch ein Destruktur mit drinnen steckt. Bei free würde der ja nicht aufgerufen werden.
Wenn Du mit new char[] alloziierst wird auch kein Konstruktor gerufen! Du kannst nur serialisierte Daten übermitteln und musst diese dann wieder deserialisieren - also daraus auf der Empfängerseite neue Objekte erstellen.

Nebenher: Wenn Du ein Array von Objekten erstellst mit new class bla[], dann musst Du auch delete [] verwenden und nicht delete! delete ruft den Destruktor auf den gezeigt wird, delete [] für alle Elemente des Arrays!
Das gilt grundsätzlich auch bei new char[size], auch wenn der Destruktor für char nichts tut.

Re: new und malloc

Verfasst: Di Mär 12, 2013 8:31 pm
von Glocke
Okay danke für die Hinweise :)