You get cyclic references of
std::shared_ptr if they refer to each other. So, the resource counter never becomes 0, and the resource is not automatically released. You can break this cycle if you embed an
std::weak_ptr in the cycle.
std::weak_ptr does not modify the reference counter.
The result of the code sample is that the daughter is automatically released, but neither the son nor the mother is. The mother refers to her son via an
std::shared_ptr and to her daughter via an
std::weak_ptr. Maybe it helps to see the structure of the code in an image.