$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Lorenzo Bettini (bettini_at_[hidden])
Date: 2005-06-06 08:58:41
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