2017-07-27 12 views
0

Wenn das Ergebnis des Anrufs fn()const std::shared_ptr<SomeType> ist, welcher ist der beste Typ für den Client, um das Ergebnis zu speichern?Wie speichere ich shared_ptr result?

dh:

auto result = fn(); 

m_myResult = result.get() //or something 

Welche Art sollte m_myResult sein? SomeType *? oder SomeType? oder shared_ptr<SomeType>?

+6

Fragen selbst warum die Funktion einen gemeinsamen Zeiger zurückgibt. – juanchopanza

+5

Warum nicht 'std :: shared_ptr '? –

+0

[shared_ptr :: get] (http://en.cppreference.com/w/cpp/memory/shared_ptr/get) gibt 'T *' zurück. – mch

Antwort

2

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