In C++11, you can use a shared_ptr<>
to establish an ownership relation with an object or variable and weak_ptr<>
to safely reference t
A function taking a raw pointer or reference implicitly promises not to hold on to a copy of that pointer after the function has returned. In return the caller promises that the pointer is valid (or nullptr
) until the callee has returned.
If you want to hold on to the pointer, you are sharing it (and should use shared_ptr
). A unique_ptr
manages a single copy of the pointer. You use raw pointers (or references) to refer to call functions involving that object.
This is the same for shared_ptr
objects. weak_ptr
only comes into play when you want to have an additional reference to the pointed too object that outlives the involved function. The main purpose of weak_ptr is to break reference cycles where two objects hold references to each other (and are therefore never released).
Remember however that taking shared_ptr
or weak_ptr
implies that the function taking that parameter will (optionally) modify some other object to retain a reference to the pointed to object that outlives the invocation of the function. In the vast majority of cases you use raw pointer (if nullptr
is a valid value) or ref (when a value is guaranteed) even for shared_ptr or weak_ptr.