In C ++ dreht sich alles um Speicherbesitz - auch bekannt als Besitzersemantik .
Es liegt in der Verantwortung des Besitzers eines Teils des dynamisch zugewiesenen Speichers, diesen Speicher freizugeben. Die Frage wird also wirklich, wem die Erinnerung gehört.
In C ++ Eigentum dokumentiert wird durch die Art eines roh ist Zeiger in so in einem guten (IMO) C ++ Programm ist es sehr selten (gewickelte selten , nicht nie ) um rohe Zeiger zu sehen weitergegeben (wie rohe Zeiger nicht so Eigentum geschlossen haben , können wir nicht sagen, wem der Speicher gehört, und daher können Sie ohne sorgfältiges Lesen der Dokumentation nicht sagen, wer für den Besitz verantwortlich ist).
Umgekehrt ist es selten, dass Rohzeiger in einer Klasse gespeichert werden. Jeder Rohzeiger wird in einem eigenen Smart-Pointer-Wrapper gespeichert. ( NB: Wenn Sie kein Objekt besitzen, sollten Sie es nicht speichern, da Sie nicht wissen können, wann es außerhalb des Gültigkeitsbereichs liegt und zerstört wird.)
Also die Frage:
- Auf welche Art von Besitzsemantik sind Menschen gestoßen?
- Welche Standardklassen werden verwendet, um diese Semantik zu implementieren?
- In welchen Situationen finden Sie sie nützlich?
Behalten wir 1 Art semantischen Eigentums pro Antwort bei, damit sie einzeln nach oben und unten abgestimmt werden können.
Zusammenfassung:
Konzeptionell sind intelligente Zeiger einfach und eine naive Implementierung einfach. Ich habe viele versuchte Implementierungen gesehen, aber sie sind immer auf eine Weise kaputt, die für gelegentliche Verwendung und Beispiele nicht offensichtlich ist. Daher empfehle ich, immer gut getestete Smart Pointer aus einer Bibliothek zu verwenden, anstatt Ihre eigenen zu rollen. std::auto_ptr
oder einer der intelligenten Boost-Zeiger scheint alle meine Bedürfnisse abzudecken.
std::auto_ptr<T>
::
Einzelne Person besitzt das Objekt. Eigentumsübergang ist zulässig.
Verwendung: Hiermit können Sie Schnittstellen definieren, die die explizite Eigentumsübertragung anzeigen.
boost::scoped_ptr<T>
Einzelne Person besitzt das Objekt. Eigentumsübergang ist NICHT erlaubt.
Verwendung: Wird verwendet, um explizites Eigentum anzuzeigen. Das Objekt wird vom Destruktor zerstört oder beim expliziten Zurücksetzen.
boost::shared_ptr<T>
( std::tr1::shared_ptr<T>
)
Mehrfachbesitz. Dies ist ein einfacher Zeiger mit Referenzzählung. Wenn der Referenzzähler Null erreicht, wird das Objekt zerstört.
Verwendung: Wenn ein Objekt mehrere Owers mit einer Lebensdauer haben kann, die zur Kompilierungszeit nicht bestimmt werden kann.
boost::weak_ptr<T>
::
Wird shared_ptr<T>
in Situationen verwendet, in denen ein Zeigerzyklus auftreten kann.
Verwendung: Wird verwendet, um zu verhindern, dass Zyklen Objekte behalten, wenn nur der Zyklus eine gemeinsame Nachzählung verwaltet.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good (IMO)
Kann das umformuliert werden? Ich verstehe es überhaupt nicht.
In C++ ownership is documented by the type a RAW pointer is wrapped inside thus in a good C++ program it is very rare to see RAW pointers passed around
. RAW-Zeiger haben keine Besitzersemantik. Wenn Sie den Eigentümer nicht kennen, wissen Sie nicht, wer für das Löschen des Objekts verantwortlich ist. Es gibt mehrere Standardklassen, die zum Umschließen von Zeigern (std :: shared_ptr, std :: unique_ptr usw.) verwendet werden, die den Eigentümer und damit definieren Definieren Sie, wer für das Löschen des Zeigers verantwortlich ist.