
Hi I have this simple program, that has a class with a shared pointer to another object of the same type: #include <boost/shared_ptr.hpp> #include <string> #include <iostream> using namespace std; class C; typedef boost::shared_ptr<C> CP; class C { private: string s; CP cp; public: C(const string &ss, CP c = CP()) : s(ss), cp(c) {} void set(CP c) { cp = c; } ~C() { cout << "deleting C" << endl; } }; int main() { CP cp = CP(new C("C")); CP cp2 = CP(new C("C2")); cp->set(cp2); //cp->set(cp); cout << "use_count: " << cp.use_count() << endl;; return 0; } if I remove the comment for cp->set(cp), i.e., I set the shared_pointer to itself, there's a cycle, and thus use_count returns 2, and the object cp is never deleted (shown also by using valgrind). This is a simple program just to reproduce a much more complex situation with a data structure that deals with mutual recursive references. I do not know in advance whether the shared pointer refers to the same object or to another different object (for instance I perform also cp->set(cp2)). Now, the documentation (http://www.boost.org/libs/smart_ptr/shared_ptr.htm) says that "Because the implementation uses reference counting, cycles of shared_ptr instances will not be reclaimed. For example, if main() holds a shared_ptr to A, which directly or indirectly holds a shared_ptr back to A, A's use count will be 2. Destruction of the original shared_ptr will leave A dangling with a use count of 1. Use weak_ptr to "break cycles."" However, it is not clear to me how to use weak_ptr in this context... can some one provide some clue, please? many thanks in advance Lorenzo