Da der Zähler und das Objekt dieselbe Zuweisung haben, teilen sie sich auch die gleiche Freigabe.
Der Zähler muss bestehen bleiben, bis die letzten shared_ptr
und weak_ptr
weggehen. Wenn Sie ein großes Objekt (oder viele kleine Objekte) mit langlebigen weak_ptr
s haben, kann dies zu Speicherkonflikten führen, wenn Sie die shared_ptr
s über make_shared
zuweisen.
Zweitens, wenn Sie eine API eines Drittanbieters haben, die Ihnen einen Zeiger oder ein Ressourcenhandle übergibt und möglicherweise über eine eigene Dispose-Funktionalität verfügt, ist make_shared
weder geeignet noch in jedem Fall möglich. Erstellen Sie Ihre eigenen make_
Funktionen können die unordentlichen Details aus dem Weg halten Sie mit diesem Problem umgehen, und befasst sich auch mit der Ausnahme Ecke Fall.
Schließlich, während gemeinsame Zeiger sind genial, sie sind auch übermäßig stark. Ziemlich oft möchte ich einen unique_ptr
oder sogar einen boost::scoped_ptr
oder einen intrusiven Referenzzählzeiger oder dergleichen, um den Besitz darzustellen. shared_ptr
sollte nur verwendet werden, wenn die Situation tatsächlich beinhaltet shared Eigentum der Ressource: mit ihm willy nilly, weil es "einfach" ist neigt dazu, mit der Ressource Äquivalent von Spaghetti-Code enden.
'shared_ptr (neues int)' wird Speicher nicht verlieren, wenn der 'shared_ptr' Konstruktor wirft; Das scheint mir dein zweiter Punkt zu bedeuten. –
Simple