2016-04-11 6 views
4

Der folgende Code führt zu einem Laufzeitfehler.Referenzzählung funktioniert nicht in shared_ptr

Jede shared_ptr enthält den gleichen Speicher, aber die Anzahl für jeden ist eins.

Also, jeder gemeinsame Zeiger ist anders, also, wenn sie außerhalb des Bereichs gehen, versuchen sie, den Block zu befreien, und dies verursacht, den Haufen zu korrumpieren. Meine Frage ist, wie man das vermeidet?

wollen einfach Erklärung wie diese

shared_ptr<int> x(p); 

ist nicht verhandelbar ich es erklären müssen hinzuzufügen.

+4

'shared_ptr b = a;' usw.? Das ist der einzige Weg, um tatsächlich einen * shared * -Zeiger zu haben, sonst könnten Sie die neuen Smart Pointer gar nicht verwenden. –

+0

Außerdem empfehle ich Ihnen, die Smartpointer nicht einfach als "selbstlöschende Pointer" zu betrachten, sondern stattdessen als * Ownership *. Kann eine Ressource oder ein Ding nur einen einzelnen Besitzer gleichzeitig haben? Dann benutze 'std :: unique_ptr'. Kann eine Ressource oder ein Ding mehrere gleichzeitige Besitzer haben? Dann benutze 'std :: shared_ptr'. –

+0

Schließlich, in der Programmierung * nichts * ist "nicht verhandelbar". Wenn die von Ihnen verwendeten Funktionen der aktuellen Programmiersprache oder des verwendeten Frameworks nicht Ihren Anforderungen entsprechen, müssen entweder die Anforderungen oder die Sprache/das Framework geändert werden. –

Antwort

10

Sie können nur einen intelligenten Zeiger aus einem rohen Zeiger kisten, wenn Sie Eigentümer des Zeigers sind. Sobald Sie den Smart Pointer erstellt haben, wurde der Besitz an den Smart Pointer übergeben. Da Sie nicht mehr Eigentümer sind, können Sie keine zusätzlichen intelligenten Zeiger aus dem rohen Zeiger erstellen.

Um einen freigegebenen Zeiger auf Speicher erhalten, die bereits verwaltet wird/von einem gemeinsamen Zeiger gehörte, Sie aus dem vorhandenen freigegebenen Zeiger kopieren müssen:

shared_ptr<int> b = a; 
shared_ptr<int> c = a; 
// .... 

Wenn Sie einfach mehr gemeinsam genutzte Zeiger aus dem rohen Zeiger erstellen, dann wird keiner dieser geteilten Hinweise über die Existenz der anderen wissen, und alle werden glauben, der einzige Besitzer dieser Erinnerung zu sein, und die Probleme, die Sie beschreiben, werden auftreten.

Verwandte Themen