As I understand it, in the current specification of C++11, one should use:
std::unique_ptr<>for one owner (most of the time)std::shared_ptr<>only when there are multiple owners in acyclic structurestd::weak_ptr<>sparingly only when there are cycles that need to be broken- A raw pointer as a handle to memory (no ownership) when a reference would not suffice
So my questions are:
- Are these policies sufficient or are there additional policies that
I should be aware of? - Are
scoped_ptr<>andauto_ptr<>effectively obsolete?
auto_ptris deprecated in C++11, so there’s your answer.scoped_ptrdoesn’t exist in C++11 and never did. The main reason to useboost::scoped_ptris to ensure that ownership is never transferred (unless you cheat, of course). Then again, if you useunique_ptr, ownership can only be transferred if you usestd::moveor similar constructs. Or, as Howard points out, just make it aconst std::unique_ptr.So it’s really up to you whether you want that extra bit of insurance. Also
boost::scoped_ptrdoesn’t have deleter support. Sounique_ptrcan play tricks thatboost::scoped_ptrcannot.I can’t say I agree with this policy necessarily. A
weak_ptrshould be used when an object may want to talk to something else, but it doesn’t own that something else. Which means that it can be deleted at any time, and the holder of theweak_ptrneeds to be able to handle that deletion anytime it tries to talk to it.Breaking cycles is one of the uses of
weak_ptr; it should not be the only time it is used.