Wenn Sie memcpy
so verwenden, wie Sie sind, haben Sie zwei std::string
-Objekte, die genau identisch sind. Dies schließt Zeiger ein, die sie intern verwenden können. Wenn also der Destruktor für jedes Objekt ausgeführt wird, versuchen beide, denselben Zeiger freizugeben.
Dies ist der Grund, warum Sie entweder den Kopierkonstruktor verwenden oder einen anderen zuweisen müssen (d. h., Sie verwenden den überschriebenen operator=
). Es kennt diese Implementationsunterschiede und behandelt sie korrekt, d. H. Es weist einen separaten Speicherpuffer für das Zielobjekt zu.
Wenn Sie die in std::string
enthaltene Zeichenfolge extrahieren möchten, müssen Sie das Objekt serialisieren in eine bekannte Repräsentation. Dann können Sie deserialisieren , um es zurück zu konvertieren.
Sie würden ähnliche Schritte für andere Klassenobjekte ausführen.
Sie können nicht memcpy()
eine Nicht-POD-Struktur wie test
. Sie haben das std::string
-Member vollständig zerstört.
Sie müssen den Kopierkonstruktor verwenden, um C ++ - Objekte zu kopieren.
Der eigentliche Grund, warum Sie einen doppelten freien Fehler erhalten, besteht darin, dass Sie anstelle eines neuen String-Objekts für Ihre Variablen a
und b
nur die Referenz kopieren (ein string
-Objekt ist) implementiert mit einer variablen Länge char *
).
Da der string
destructor diese Speicheradresse freigibt, wenn Ihr Programm endet, und wie oben erklärt, haben Sie zwei String-Objekte, die auf die gleiche Adresse zeigen, Sie erhalten einen doppelten freien Fehler
Dies funktioniert, wie @JesperJuhl sagte, Sie müssen einen Kopierkonstruktor verwenden
%Vor%