Konstruktor unique_ptr<T>
akzeptiert einen rohen Zeiger auf ein Objekt des Typs T
(so, es nimmt ein T*
).
Im ersten Beispiel:
unique_ptr<int> uptr (new int(3));
Der Zeiger ist das Ergebnis eines new
Expression, während im zweiten Beispiel:
unique_ptr<double> uptr2 (pd);
Der Zeiger wird in dem pd
Variable gespeichert.
Konzeptionell ändert sich nichts (Sie unique_ptr
aus einem rohen Zeiger bauen), aber der zweite Ansatz ist potenziell gefährlich, da es Ihnen erlauben würde, zum Beispiel zu tun:
unique_ptr<double> uptr2 (pd);
// ...
unique_ptr<double> uptr3 (pd);
So hat zwei eindeutige Zeiger, die das gleiche Objekt effektiv einkapseln (und somit die Semantik eines eindeutigen Zeigers verletzen).
Aus diesem Grund ist die erste Form zum Erstellen eines eindeutigen Zeigers, wenn möglich, besser. Beachten Sie, dass wir in C++ 14 können:
unique_ptr<int> p = make_unique<int>(42);
Das ist sowohl klarer als auch sicherer.Jetzt über diese Zweifel von Ihnen:
What is also not clear to me, is how pointers, declared in this way will be different from the pointers declared in a "normal" way.
Intelligente Zeiger sollen Objektbesitz modellieren, und automatisch den spitzen Gegenstand zu zerstören kümmern, wenn die letzten (smart, den Besitz) Zeiger auf dieses Objekt den Gültigkeitsbereich fallen.
Auf diese Weise müssen Sie dynamisch zugewiesen tun delete
auf Objekte nicht mehr erinnern - der Destruktor des Smart-Pointer wird für Sie das tun - noch zu kümmern, ob werden Sie nicht dereferenzieren ein (baumelnden) Zeiger auf ein Objekt, das wurde bereits zerstört: ein (Besitz) Zeiger auf den spitzen Gegenstand nur
{
unique_ptr<int> p = make_unique<int>(42);
// Going out of scope...
}
// I did not leak my integer here! The destructor of unique_ptr called delete
Jetzt unique_ptr
ein Smart-Pointer ist, dass Modelle einzigartige Eigentum, was bedeutet, dass es jederzeit in Ihrem Programm sein soll - das ist, warum unique_ptr
ist nicht kopierbar.
Solange Sie Smart Pointer in einer Weise verwenden, die den impliziten Vertrag nicht bricht, den Sie einhalten müssen, haben Sie die Garantie, dass kein Speicher verloren geht und die Eigentumsrichtlinien für Ihr Objekt korrekt sind erzwungen. Raw-Zeiger geben Ihnen diese Garantie nicht.
'new int (3)' gibt einen Zeiger auf den neuen 'int' zurück, genau wie' pd' ein Zeiger auf den neuen 'double' war. –