Ich lerne gerade über intelligente Zeiger, und ich habe Probleme beim Zuweisen einer bereits vorhandenen Position einer Variablen zum freigegebenen Zeiger der Standardbibliothek.
Nehmen wir zum Beispiel an, Sie haben ein int x, von dem Sie den Wert nicht kennen. Mit normalen Zeigern habe ich einfach
gemacht %Vor%Ich habe beides mit gemeinsamen Zeigern versucht und
%Vor%Also ich bin ziemlich verloren, wie es geht.
Sie würden (normalerweise) keinen intelligenten Zeiger auf eine existierende Variable setzen. Ein intelligenter Zeiger verwaltet die Lebensdauer eines dynamisch zugewiesenen Objekts und löscht sie nach der Verwendung. Wenn Sie es auf etwas richten, das nicht dynamisch zugewiesen wurde, wird ein Fehler verursacht, wenn es versucht wird, es zu löschen.
Normalerweise würden Sie new
oder make_shared
verwenden, um ein Objekt zu erstellen und einen intelligenten Zeiger mit dem Ergebnis zu erstellen oder zuzuweisen:
make_shared
ist normalerweise besser als new
, da es den Speicher besser ausnutzt und eine stärkere Ausnahmesicherheit bietet.
Gemeinsam genutzte Zeiger werden verwendet, um dynamisch zugewiesenen Speicher zu verwalten und genauer gesagt, sie verwalten den Besitz für diesen Speicher.
Grundsätzlich ist ein intelligenter Zeiger eine Materialisierung der Initialisierung der Ressourcenerfassung oder RAII. Ich schlage vor, dass Sie sich dieses Prinzip ansehen, da es äußerst nützlich ist, Ressourcenbesitz zu verwalten (grundsätzlich jedes Mal, wenn Sie eine Ressource erwerben und freigeben müssen, sei es Speicher, Datenbankverbindung, Dateihandler, Mutex) usw.).
Was es tut, ist im Grunde genommen garantiert, dass, während jemand auf den dynamisch zugewiesenen Speicher zeigt, den er verwaltet, dieser Speicher verfügbar ist, und sobald die letzten (intelligenten) Zeiger auf diesen Speicher den Geltungsbereich verlassen, dann delete
heißt.
Dann macht es keinen Sinn, intelligente Zeiger mit Variablen zu verwenden, die eine automatische Speicherdauer haben (dh die entfernt werden, wenn sie den Gültigkeitsbereich verlassen oder wenn das Objekt, dem sie angehören, sich selbst außerhalb des Geltungsbereichs befindet oder gelöscht wird es war neu).
Sobald der Referenzzähler des shared_ptr Null erreicht, wird das Objekt durch den letzten shared_ptr gelöscht. Mit intelligenten Zeigern können Sie die Funktion angeben, die das Objekt löschen soll.
Der Deleter ist eine einfache Funktion (standardmäßig der übliche Operator delete), der entweder statisch über den Template-Parameter an den Smart Pointer gebunden werden muss (siehe unique_ptr ) oder dynamisch über Konstruktorparameter (siehe shared_ptr ).
%Vor%Sie sollten keinen intelligenten Zeiger erstellen, der auf ein Objekt verweist, das nicht dynamisch zugeordnet ist. Andernfalls versucht der Smart Pointer möglicherweise, den zugewiesenen Speicher zu löschen, was wiederum einen Fehler verursacht.
Tags und Links c++ shared-ptr std tr1