I think we should learn shared_ptr (sptr) before weak_ptr, scoped_ptr or intrusive_ptr.
A shared_ptr object is a an object — NOT a variable. It can either be a stackVar or a field (or a global). As a stackVar, the var will get out of scope, and the shared_ptr’s destructor will run and do its job. As a field, will the sptr dtor do its job? yes see P22.
A shared_ptr (and its sisters) keeps the shared counter somewhere on heap. Allocation of this counter is considered expensive, since you may allocate millions of counters each second. See http://stackoverflow.com/questions/14482830/stdshared-ptr-thread-safety first answer
Some people may say a shared_ptr can be used much like a raw ptr, but i don’t agree. I feel you need to see enough (simple and non-trivial) examples. For example
- raw ptr can become null
- raw ptr size is well-known
- raw ptr thread safety is simple
Note some sptr ctor creates the “1st ref” in the ref-counting pointer group; other ctors create “2nd ref”. Make sure you know which ctor is which type.
Q: Are both the smae — mySp.get() vs *mySp
A: No. operator*() is equivalent to *mySp.get()
Q8a: is it normal to replace a ptr field with a sptr field?
A8a: yes. See eg on P21
Q8b: in the destructor, do you need to handle the sptr field as you would the raw ptr field?
A8b: i think u can relax. Dtor of the sptr field will be invoked in the DCB order. If there’s a raw ptr field, its dtor will run but it won’t call reclaim the pointee.
Q: do we ever call operator new and assign it to a sptr?
A: yes see p21
Q: is a sptr always cleaned up upon exception?
A: i think so. stack unwinding calls sptr object’s dtor
Q: if a method expects a particular ptr type, can you pass in a sptr?
A: i don’t think so. Compiler error. Compiler needs the type for memory allocation.
Q: if a method expects a particular type of sptr, can you pass in a raw ptr?
A: i don’t think so
Q: if a sptr stackVar goes out of scope, will the destructor get called?
A: yes P21
Q: deleting a sptr vs destructing a sptr?
A: a sptr is not a 4-byte thingy created with NEW, so u can’t call delete on it.
Q: do we ever destruct a shared_ptr explicitly?
A: i think so