Sie haben wahrscheinlich ein 5-Byte-Speicherleck festgestellt, aber es ist nicht wegen der string
.
Jeder Anruf an strdup
erstellt eine neue char[]
der Größe, die der Länge der Zeichenfolge entspricht. Sie sollten es an einen rohen Zeiger char*
binden und es irgendwann entfernen.
Was Sie stattdessen getan haben, ist, dass Sie einen temporärenchar*
Zeiger erstellen. Nennen wir es temp
für unsere Zwecke. Der temp
String wird dann an den Konstruktor std::string
übergeben. Die std::string
macht eine weitere Kopie davon, die ursprüngliche temp
bleibt intakt.
Dann verschwindet der Zeiger temp
einfach, ohne den Speicher ordnungsgemäß zu löschen.
Am Ende, wenn das std::string
Objekt zerstört wird, löscht es ordnungsgemäß seine eigene, private Kopie der Zeichenfolge. Aber die Erinnerung, auf die zuvor von temp
hingewiesen wurde, wird niemals freigegeben.
Eine schnelle Lösung wäre:
char* temp = strdup(kot->name.c_str());
name = temp;
free(temp);
aber Sie haben nicht einmal das zu tun haben! Wenn Sie ein Objekt std::string
einem anderen zuweisen, erstellen Sie bereits eine ordnungsgemäße Kopie seines Inhalts. Also:
name = kot->name;
wird höchstwahrscheinlich genau das tun, was Sie versuchen, bereits zu erreichen - das Erstellen einer Kopie von kot->name
in Ihrem name
. In einem solchen Szenario werden name
und kot->name
zwei völlig separate Strings mit demselben (kopierten) Inhalt. Von diesem Zeitpunkt an hat das Ändern/Löschen keinen Einfluss mehr auf den anderen.
Verwenden Sie nicht strdup, wenn Sie C++ - Code schreiben, sondern einfach einem neuen String zuweisen, dh 'name = kot-> name;' dann erhalten Sie eine Kopie –