Re: [Boost-users] More on Newby question re (boost::shared_ptr) enable_shared_from_this
I've manage to narrow down what the problem is and created a test case
that simulates my real code.
The problem occurs in a destructor (of B1) when it tries to get a shared
pointer to shared_from_this() from its base class (base_class). I think
that the execution of the destructor hierarchy has deleted the original
shared_ptr to B2 meaning that the shared_from_this() returns an error
(because shared_from_this() requires that the object is managed by a
shared_ptr).
My original destructor code was using raw pointers (ie. this) which worked
fine because the base_class destructor was last to be called and was still
alive at the time when ~B2() is called. This seems like it could be a
limitation of boost::shared_ptr?
I have placed my code in the destructor of B2 because in my program I am
never sure exactly of the lifespan of B2. During execution I accumulate
information in the B2 object and then write out this information at the
end of its lifespan i.e in the destructor.
I'm open to any ideas including any ways that I might be able to
restructure my program.
#include
He Ethann,
On 1/23/07, ethann.castell@caliton.com
class B1 : public B { public: B1(boost::shared_ptr
pLinked) : B( pLinked){} ~B1() { try{ boost::shared_ptr ptr_This = shared_from_this(); // Exception occurs here
Let me explain why this is exception is thrown. As I said before the object has to be owned by a shared_ptr whenever your are calling shared_from_this(). To trigger the object's destruction (we are in the destructor) somebody called delete on the object. This can only be the case if the last shared_ptr released the object (if there isn't another error). Therefore you are not allowed to call shared_from_this() anymore.
if (f == 3){ boost::shared_ptr<B2> ptr_b2( new B2(ptr_me) ) ; // create new B2 and pass pointer to me. }else{ // crashes with bad_weak_ptr error on this line.
This is the same problem again. The exception is thrown by B1's destructor (B2 is derived from B1). Best regards, Philipp
ethann.castell@caliton.com wrote:
I've manage to narrow down what the problem is and created a test case that simulates my real code.
The problem occurs in a destructor (of B1) when it tries to get a shared pointer to shared_from_this() from its base class (base_class). I think that the execution of the destructor hierarchy has deleted the original shared_ptr to B2 meaning that the shared_from_this() returns an error (because shared_from_this() requires that the object is managed by a shared_ptr).
My original destructor code was using raw pointers (ie. this) which worked fine because the base_class destructor was last to be called and was still alive at the time when ~B2() is called. This seems like it could be a limitation of boost::shared_ptr?
~B2 is executed after the last shared_ptr instance to the object has been destroyed. There is no way to revive the object once its destruction has been started, so it doesn't make sense to allow a shared_ptr to the object to be created; it won't be able to fulfill its promise to keep the object alive. You can create a shared_ptr in ~B2 with a null deleter, but its limitations remain. If you pass it to outside code that stores it for later use, things will break sooner or later. In general, functions that don't need to control the lifetime of the object won't need to take a shared_ptr, just a reference (or a raw pointer); it isn't clear why this is not the case in your code.
participants (3)
-
ethann.castell@caliton.com
-
Peter Dimov
-
Philipp Henkel