- Don’t use raw pointers as class members; that requires managing object life time and manually avoiding dangling pointers
- Use smart pointers instead of raw pointers
- Don’t use object references as class members as that makes objects of the class non-assignable (which means you cannot store said objects in standard C++ containers)
- Using raw pointers and object references to objects stored in standard C++ containers is problematic or impossible. Objects in containers can be relocated (addresses can change) rendering raw pointers and object references invalid.
- Best (only feasible?) option is to store
std::shared_ptr of the dynamically allocated object in the container.
std::shared_ptr is reference counted std::weak_ptr is not
- Use
std::make_shared to create an std::shared_ptr to a dynamically created object instance or use std::shared_ptr(new T())
- Only way to access members via
std::weak_ptr is by calling std::weak_ptr::lock which returns an std::shared_ptr or 0
- To create an
std::weak_ptr from the this pointer, the class must first derive from std::enable_shared_from_this and then call the shared_from_this function to get an std::shared_ptr pointing to the object. The object in question must be “owned” by an std::shared_ptr or else undefined behaviour results. Also, shared_from_this must not be called from a constructor since the object is yet to be reference counted (i.e. object is not yet “owned” by an std::shared_ptr)
- As a result of the previous point, it helps to ensure that objects can only be created via
std::shared_ptr by using a public static create function (which returns objects “owned” by an std::shared_ptr) and making constructors private. Note that when constructors are made private, you can no longer use std::make_shared to create a shared pointer. You must use std::shared_ptr(new T()) in this case.
Modern C++ Object Relationships