Kommt free() nicht mit Arrays klar?
-
Hi @all!
Folgendes Problemchen: Ich habe ein Array von Klassen, das mit einer Add-Methode vergrößert werden soll. Normalerweise würde ich das so machen (z.T. mit C++-Commands):CKlasse* newarray = new CKlasse[newsize]; memcpy(newarray, oldarray, sizeof(oldarray[0])*oldsize); delete[] oldarray;Hat sich in der Vergangenheit auch bewährt. Jetzt will ich das ganze aber mit einer Klasse machen, die selbst Pointer als Member hat und den Speicherplatz, auf den diese verweisen, beim Aufruf des Destruktors wieder freigibt. So würden die Elemente des newarray früher oder später eine Zugriffsverletzung verursachen.
Damit genau das nicht passiert, benutze ich bei dieser Klasse nicht delete[] sondern free(). Leider funktioniert das ganze nur solange das oldarray nicht mehr als 1 Element hat. Ab zwei Elementen sagt Windows "keine Rückmeldung". 
Kommt free() also nicht mit Arrays klar? Kann es sein, dass man noch irgendwas daran anpassen muss (wie bei delete, das zu delete[] wird)?
Bin dankbar für jede Hilfe.
Mr Train
-
malloc/free kennen keine "Arrays" sondern nur Speicherblöcke. free kommt außerdem nur mit malloc-angeforderten Speicher klar, du kannst new und free bzw. malloc und delete miteinander nicht vermischen, was ich aus deiner Erklärung vermute.
-
...und lasse er sich ins c++ forum verschieben.

-
Dieser Thread wurde von Moderator/in rüdiger aus dem Forum ANSI C in das Forum C++ verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Erstens würde ich für solche Sachen einen Container der Standardbibliothek empfehlen. Z.B
std::vector, oder je nach Vergrösserungsverhaltenstd::list.Aber zu dem Problem sehe ich nicht ganz, was du meinst. Du kannst du auch innerhalb einer Klasse ganz normal new[]/delete[] benutzen..
-
Mr Train schrieb:
Bin dankbar für jede Hilfe.
der code ist furchtbar und extrem fehleranfällig. objekte mit memcpy zu kopieren funktioniert nur in bestimmten ausnahmefällen, und free ist ganz bestimmt kein ersatz für delete[]. free und malloc sollten generell in c++ quasi nie verwendet werden (müssen), sofern man es nicht gerade mit schlecht programmierten c-interfaces zu tun hat.
du solltest dich entscheiden, ob du in c++ oder c programmieren willst.
gibt es einen grund dafür, warum nicht die standard-container nimmst?
http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html
-
sichadat schrieb:
free und malloc sollten generell in c++ quasi nie verwendet werden (müssen), sofern man es nicht gerade mit schlecht programmierten c-interfaces zu tun hat.
... oder man sich auf Low-Level-Ebenen bewegt, zum Beispiel für Allokatoren, Speicherüberwachungstools etc.
Mr Train, nimm statt
memcpy()den STL-Algorithmusstd::copy(), der kopiert nämlich Objekte semantisch statt byteweise und führt auch bei Non-PODs nicht zu undefiniertem Verhalten.
-
Du hast irgendwo einen Logikfehler. Es kann nicht sein, dass mehrere Objektinstanzen einen Pointer haben, die alle auf das gleiche zeigen und sich die Klasse trotzdem um die Speicherverwaltung von diesen kümmern will (ohne sich abzusprechen).
Du kannst hier shared_ptr verwenden oder im Kopierkonstruktor jeweils eine neue Instanz des problematischen Objekts erzeugen anstatt nur den Zeiger zu kopieren.Edit: und von memcpy musst du dich dann natürlich auch trennen, wie schon erwähnt wurde.