How to detect cycles when using shared_ptr
I understand your annoyance at being glibly told to use weak_ptr
to break cyclic references and myself I almost feel rage when I am told that cyclic references are bad programming style.
Your ask specifically how do you spot cyclic references. The truth is that in a complex project some reference cycles are indirect and difficult to spot.
The answer is that you should not make false declarations that leave you vulnerable to cyclic references. I am serious and I am criticizing a very popular practice - blindly using shared_ptr for everything.
You should be clear in your design which pointers are owners and which are observers.
For owners use shared_ptr
.
For observers use weak_ptr
- all of them, not just those you think may be part of a cycle.
If you follow this practice then the cyclic references will not cause any problems and you don't need to worry about them.
Of course you will have a lot of code to write to convert all these weak_ptr
s to shared_ptr
s when you want to use them - Boost really isn't up to the job.
shared_ptr
represents ownership relation. While weak_ptr
represents awareness. Having several objects owning each other means you have problems with architecture, which is solved by changing one or more own's into aware of's (that is, weak_ptr
's).
I don't get why suggesting weak_ptr
is considered useless.