Das Problem, das Sie hier treffen, ist ein doppeltes Löschen. Da Sie hier keine Kopierkonstruktoren definiert haben, macht C++ das gerne für Sie. Die Implementierung führt dies durch Ausführen einer flachen Kopie aller Inhalte durch.
f(x);
Diese Linie funktioniert, indem eine Kopie x
erstellen und zu f
vorbei. An diesem Punkt gibt es 2 temp
Instanzen, die ein einzelnes Mitglied besitzen. Beide Instanzen werden diesen Zeiger löschen, und das ist wahrscheinlich, was Ihren Absturz verursacht.
um dieses Problem zu umgehen Sie eine Reihe von Maßnahmen ergreifen können,
- einen Zeigertyp für den Austausch wie
shared_ptr<T>
- , die durch ref übergeben werden zwingt die Instanz erstellen unkündbare Copykonstruktor gemeint Verwenden
Ein Beispiel # 2 ist
class temp {
temp(const temp& other);
temp& operator=(const temp& other);
public:
// Same
};
Jetzt wird die Zeile f(x)
einfach nicht kompiliert, da sie nicht auf den notwendigen Kopierkonstruktor zugreifen kann. Es zwingt es stattdessen, f
neu zu definieren, um eine Kopie zu verhindern.
void f(const temp& fInput) {
...
}
Können Sie "Absturz" definieren? – josephthomas
@ Ed S: Ich stimme allerdings zu, dass manchmal, was wir für einen Absturz halten, anders sein könnte als das, was er für einen Absturz hält. – josephthomas
@josephthomas: Ja, das habe ich mir gedacht, weshalb ich meinen Kommentar kurz nach dem Posten gelöscht habe :) Wir können uns auf die korrekte Verwendung des Begriffes einigen ... Ob die meisten Anfänger ihn richtig benutzen werden, ist ein anderes Problem –