Typo on my part in this email. I've used enable_shared_from_this in my real code. Any other ideas? The class you want to inherit from is "enabled_shared_from_this" not "shared_from_this" ethann.castell@caliton.com wrote:
A big thanks to Phillip and Brian for their help so far. You've helped me increase my understanding of how shared_ptr's and enable_shared_from_this work.
I've taken on board what you've both said but I still feel like I am missing something. I'm getting bad_weak_ptr exceptions (resulting in memory leaks) which make no sense to me. I've debugged through the code and checked the use_count and weak_count. The use_count looks ok but I'm not sure about the weak_count.
I have a base class which contains the shared_from_this and a hierarchy of extended classes that inherit from the base class. The extended classes pass pointer's to themselves, to the other classes, so that linkages can be formed between them( at the base class level ).
class base_class:: public shared_from_this prviate: boost::shared_ptr
m_Linked; // link to another base_class base_class::base_class( boost::shared_ptr
pLinked) { m_Linked = pLinked; // store link to other base class } class B : public base_class B::B(boost::shared_ptr
pLinked) : base_class( pLinked) class B1 : public B B1::B1(boost::shared_ptr
pLinked) : B( pLinked) class B2 : public B1 B2::B2(boost::shared_ptr
pLinked) : B1( pLinked) class A : public base_class
classA::Process() { boost::shared_ptr<A> ptr_a = shared_from_this(); // get pointer to myself
//afterwards - use_count = 2, weak_count = 2 ... if (some_condition){ boost::shared_ptr<B2> ptr_b2( ptr_a) ; // create new B2 and pass pointer to me. }else{ // crashes with bad_weak_ptr error on this line. } }
main() { boost::shared_ptr<A> ptr_a( new A() ); ptr_a->process }
It looks a little like ptr_a is being destroyed at the }else{ statement (although I would have expected this at the end of Process(). At the else statement ptr_a.use_count = 3, which I believe to be
correct.
I've tried passing the boost pointers by value, by reference and also as constants but none of these make a difference.
Any ideas?
------------------------------------------------------------------------
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users
_______________________________________________ Boost-users mailing list Boost-users@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-users