unique_ptr
ist nicht kopierbar, es ist nur beweglich.
Dies wirkt sich direkt auf Test aus, der in Ihrem zweiten Beispiel ebenfalls nur beweglich und nicht kopierbar ist.
In der Tat ist es gut, dass Sie verwenden, unique_ptr
was Sie vor einem großen Fehler schützt.
Das Hauptproblem bei Ihrem ersten Code ist beispielsweise, dass der Zeiger niemals gelöscht wird, was wirklich sehr, sehr schlecht ist. Angenommen, Sie würden dies beheben durch:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
Das ist auch schlecht. Was passiert, wenn Sie kopieren Test
? Es gibt zwei Klassen mit einem Zeiger, der auf dieselbe Adresse zeigt.
Wenn einer Test
zerstört wird, zerstört er auch den Zeiger. Wenn Ihre Sekunde Test
zerstört wird, wird versucht, auch den Speicher hinter dem Zeiger zu entfernen. Es wurde jedoch bereits gelöscht und es wird ein fehlerhafter Laufzeitfehler beim Speicherzugriff angezeigt (oder ein undefiniertes Verhalten, wenn wir Pech haben).
Der richtige Weg ist also, entweder den Kopierkonstruktor und den Kopierzuweisungsoperator zu implementieren, damit das Verhalten klar ist und wir eine Kopie erstellen können.
unique_ptr
ist uns hier weit voraus. Es hat die semantische Bedeutung: " Ich bin es unique
, also können Sie mich nicht einfach kopieren. " Es verhindert also den Fehler, die vorliegenden Operatoren jetzt zu implementieren.
Sie können den Kopierkonstruktor und den Kopierzuweisungsoperator für ein spezielles Verhalten definieren, und Ihr Code funktioniert. Aber Sie sind zu Recht (!) Dazu gezwungen.
Die Moral der Geschichte: Verwenden Sie immer unique_ptr
in solchen Situationen.