new und malloc

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

new und malloc

Beitrag von Glocke » Di Mär 12, 2013 1:37 pm

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 :)

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: new und malloc

Beitrag von nufan » Di Mär 12, 2013 2:27 pm

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()?

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: new und malloc

Beitrag von Glocke » Di Mär 12, 2013 2:55 pm

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

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: new und malloc

Beitrag von nufan » Di Mär 12, 2013 2:59 pm

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.

GilbertDur
Beiträge: 105
Registriert: Fr Mär 01, 2013 10:31 am

Re: new und malloc

Beitrag von GilbertDur » Di Mär 12, 2013 4:39 pm

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.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: new und malloc

Beitrag von Xin » Di Mär 12, 2013 6:38 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: new und malloc

Beitrag von Glocke » Di Mär 12, 2013 8:31 pm

Okay danke für die Hinweise :)

Antworten