With the advent of std::unique_ptr
, the blemished std::auto_ptr
can finally be put to rest. So for the last several days, I have been changing my
Use a shared_ptr
when you require multiple things own a resource (and those owning things may go in and out of scope at "random"), use a unique_ptr
when a single thing owns the resource, and use a raw pointer when you just need to refer to it and not own it (and expect this referral to not last longer than the resource exists).
There is a fourth type, a sort of raw-pointer-for-shared_ptr
's, called weak_ptr
. You use that to refer to a shared_ptr
without actually owning it; you can then check if the object is still there and use it.
Personally, this is how I (more or less) do it:
By far I use more unique_ptrs than shared_ptrs, and more raw pointers than weak pointers.
The only non-owning smart-pointer in the standard library is std::weak_ptr
. However, to use it, the actual owning object needs to hold the pointee in a std::shared_ptr
.
I assume you used std::unique_ptr
on those before. If you convert them to shared_ptr
now, you'll have the benefit that your non-owning pointers can know that the owning pointer lost is reference while raw pointers can be left dangling without any chance for the non-owning component to detect this. However, shared_ptr
will incur a (very?) small performance and memory overhead over unique_ptr
.
Personally, I recommend using one shared_ptr
and many weak_ptr
s instead of one unique_ptr
and many raw-pointers in the general case and use unique_ptr
if you really have a performance problem!