Ein shared_ptr<>
wird verwendet, um den gemeinsamen Besitz einer Speicherressource auszudrücken. Alle (entsprechend erstellten)s, die auf dasselbe Objekt zeigen, teilen ihr Eigentum: Das Objekt wird nur gelöscht, wenn das letzte shared_ptr<>
, das darauf zeigt, zerstört ist (oder reset()
, siehe unten). Wenn Sie also würde
auto raw_ptr = fn().get(); // call shared_ptr<>::get(); DON'T DO THAT
raw_ptr->member_func(); // may crash
dann die shared_ptr<>
von fn()
zurückgegeben wird sofort zerstört und das spitze zu auch kann das Objekt, oder es kann jederzeit später zerstört werden. In diesem Fall wird raw_ptr
zu dangling pointer. Um zu vermeiden, dass, müssen Sie Eigentum halten, indem ein shared_ptr<>
Objekt am Leben zu erhalten:
auto ptr = fn(); // move shared_ptr<>: pass ownership
ptr->member_func(); // fine (unless fn() returned an empty pointer)
nun die Aufgabe verwaltet von ptr
wird nicht gelöscht werden, bevor ptr
selbst ist, wenn Sie nicht ausdrücklich reset()
es:
ptr.reset(); // removes ownership from ptr
Fragen selbst warum die Funktion einen gemeinsamen Zeiger zurückgibt. – juanchopanza
Warum nicht 'std :: shared_ptr'? –
[shared_ptr :: get] (http://en.cppreference.com/w/cpp/memory/shared_ptr/get) gibt 'T *' zurück. – mch