doppelfreier oder fehlerhafter Fehler beim Kopieren eines Objekts mit memcpy

8

Ich habe den folgenden Code:

%Vor%

Wenn ich es kompiliere und es ausführe, gibt es mir den folgenden Fehler:

%Vor%

Es stellt sich heraus, dass der Code das Ergebnis ausdrucken kann. Aber wie kann ich diesen Fehler beheben?

    
Johnnylin 18.08.2016, 13:11
quelle

3 Antworten

17

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.

%Vor%

Sie würden ähnliche Schritte für andere Klassenobjekte ausführen.

    
dbush 18.08.2016, 13:18
quelle
12

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.

    
Jesper Juhl 18.08.2016 13:14
quelle
6

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%     
Ishay Peled 18.08.2016 13:18
quelle

Tags und Links