This is a constructed test case which should illustrate the problem. The bug is only a problem if you access data members of the counted_based object after the call to delete. So you can live happy without knowing anything about the bug if you never do that. //sourcecode begin #include "boost/shared_ptr.hpp" #include "boost/weak_ptr.hpp" class foo { public: void setWeak(boost::shared_ptr<foo> s) { w = s; } private: boost::weak_ptr<foo> w; //the desctuction of this member will delete the counted_based object }; class deleter { public: deleter() :lock(0) {} ~deleter() { assert(lock==0); //assert if destructor is called when we are executing } void operator() (foo *p) { ++lock; //lock the object from destruction within this operation delete p; --lock;//unlock the object } private: int lock; }; void main() { boost::shared_ptr<foo> s(new foo,deleter()); s->setWeak(s); s.reset(); } //source code end -----Original Message----- From: Peter Dimov [mailto:pdimov@mmltd.net] Sent: 11. november 2002 21:43 To: Boost-Users@yahoogroups.com Subject: Re: [Boost-Users] BUG: counted_base::release From: "perkristensennettest" <per.kristensen@nettest.com>
To me it seems like a bug, that the weak_count in counted_base::release is decremented before the call to dispose. See below [...]
If the call to dispose() indirectly calls weak_release there is an error as weak_release will decrement the --weak_count and may destruct the counted_base object. This will happen if you have an class C with a member of type weak_ptr<C>.
Do you have a test case that breaks? Info: < http://www.boost.org> Wiki: < http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl> Unsubscribe: <mailto:boost-users-unsubscribe@yahoogroups.com> Your use of Yahoo! Groups is subject to the Yahoo! Terms of Service <http://docs.yahoo.com/info/terms/> . [Non-text portions of this message have been removed]