Bestehende Werte Smart-Ptrs zuweisen?

8

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.

    
bluepanda 25.11.2013, 14:30
quelle

4 Antworten

15

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:

%Vor%

make_shared ist normalerweise besser als new , da es den Speicher besser ausnutzt und eine stärkere Ausnahmesicherheit bietet.

    
Mike Seymour 25.11.2013, 14:37
quelle
2

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).

    
JBL 25.11.2013 14:39
quelle
1

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%     
comonad 25.11.2013 16:08
quelle
0

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.

    
Ivaylo Strandjev 25.11.2013 14:36
quelle

Tags und Links