Probleme mit delete
-
Hallo zusammen,
folgender Codeschnippsel:
// Get all icon objects from the vector and write its names into the XML file for (int i=1; i< numberOfIcons; i++) { string temp = myIcons.getIconVector().at(i)->getName(); char *buf = new char[strlen(temp.c_str())]; strcpy(buf, temp.c_str()); XML.write(buf); //...When you are done with buf... delete []buf; }Verursacht eine Heap-Corruption an der delete []buf;
Hat jemand eine Idee, warum?
gruß
Alex
-
Ich glaub zwar nicht, dass es daran liegt, aber du solltest mit
new[]ein Byte mehr Speicher anfordern, dastrlen()nur die Länge des C-Strings ohne Nullterminierung zurückgibt.Ansonsten, deletest du zwei Mal, oder führst du sonstige Speicherzugriffe durch?
-
Danke!
Anscheinend lag es doch daran, mit :
char *buf = new char[strlen(temp.c_str())+1];
funktioniert es. Aber warum verstehe ich nicht

-
filth schrieb:
Aber warum verstehe ich nicht

Steht aber in meinem oberen Post. Du solltest schon genug Speicher anfordern, sonst wird das
'\0'irgendwo hingeschrieben.
-
Achso und delete versucht dann quasi einen zu langen Speicherabschnitt zu löschen?
-
weil das nullbyte am ende eines c-strings auch platz braucht und strlen gibt die länge des strings ohne dieses byte zurück. du willst ja die länge wissen, nicht die größe des benötigten speichers.
wenn diese string-variable ein std::string ist, dann wäre folgender code besser:
// Get all icon objects from the vector and write its names into the XML file for (int i=1; i< numberOfIcons; i++) { string temp = myIcons.getIconVector().at(i)->getName(); XML.write(temp.c_str()); }
-
filth schrieb:
Achso und delete versucht dann quasi einen zu langen Speicherabschnitt zu löschen?
Nein, das
delete[]löscht so viele Bytes, wie mitnew[]angefordert wurden (vorausgesetzt, du hast einen gültigen Zeiger).strcpy()ist das Problem, da es allechar-Elemente inklusive'\0'kopiert und nicht darauf achtet, ob genügend Speicher vorhanden ist oder nicht.Das ist übrigens eines der Probleme von C, in C++ kann man das mit dem Datentyp
std::stringumgehen.
-
Der Vollständigkeit halber:
1. strlen brauchst Du nicht zu bemühen, das kostet nur Zeit. string hat eine Methode size
2. Wenn Du wirklich einen non-const Puffer brauchst, nimm C++-Mittel:{ string temp = myIcons.getIconVector().at(i)->getName(); vector<char> buf(temp.c_str(), temp.c_str() + temp.size() + 1); XML.write(&buf[0]); //...When you are done with buf... // ... NOTHING, 'cause this is C++ }