The final example at page 137 of Effective Modern C++ draws the scenario of a data structure with objects A
, B
, and C
in it, connected to each other via std::shared_ptr
in the following way:
std::shared_ptr std::shared_ptr
A ─────────────────▶ B ◀───────────────── C
To me, this implies that the classes which objects A
and C
are instance of (two unrelated classes, in general) must contain a std::shared_ptr<classOfB>
member.
Then the supposition is made that we need a pointer from B
back to A
, and the available options are listed: the pointer can be raw, shared, or weak, and the last one is picked up as the best candidate.
std::shared_ptr std::shared_ptr
A ─────────────────▶ B ◀───────────────── C
▲ │
│ std::weak_ptr │
└────────────────────┘
I do understand the weaknesses (ahahah) of the first two alternatives, but I also see that the third alternative requires that member A
be already managed by some std::shared_ptr
, otherwise how can a std::weak_ptr
point to it at all?
However the book does not refer to this "limitation"/assumption/whatever, so the truth is either
- I'm wrong
- I'm right but that assumption is obvious for some reason I don't understand
- The assumption is obvious for the exact reason that a
std::weak_ptr
needs an already existingstd::shared_ptr
to the same object, but it's a bit strange it's not even mentioned at the beginning of the example, I think.
and I'm asking this question to understand this.
A
is not handled bystd::shared_ptr
, there are no alternatives... – Interruptedweak_ptr
is used here only as means of fixingshared_ptr
loops. Either you already managed the lifetime of A via a shared pointer, in which case you'd want to use a weak pointer, or you didn't consider smart pointers at all, in which case B has no way of making sure A is alive anyway. There are no alternatives in any case. – Analogical