C++ Language/Indirection/SmartPointers/OwnershipCycle
The std::weak_ptr<> type is for situations where you need access to the shared memory payload that is being collectively managed by several std::shared_ptr<>, but you don't want this std::weak_ptr<> to affect the reference count.
A cyclic data structure is one example where that is needed.
Additional information about weak_ptr (includes interactive examples)