Modify

Ticket #147 (closed Support Requests: Rejected)

Opened 11 years ago

Last modified 11 years ago

shared_from_this fails in a destructor

Reported by: nobody Owned by: pdimov
Milestone: Component: smart_ptr
Version: None Severity:
Keywords: Cc:

Description

version: boost 1.30.0
library: smart pointers

I am using the boost::enable_shared_from_this base
class from the smart pointer library to implement
shared_from_this in my classes. I was amazed to find
this class, after hours of thashing trying even to
figure out the very problem it solves. So, first off,
thanks to the boosters.

My problem is that shared_from_this() throws
boost::bad_weak_ptr if called from my class's
destructor. Is this a design decision? a bug? am I
misunderstanding a class requirement?

The problem (if it is one...) is that
sp_counted_base::release() decrements use_count_ before
calling dispose(). Then when my class calls
shared_from_this from its destructor (via dispose()),
sp_counted_base::add_ref fails (use_count == 0) and
throws boost::bad_weak_ptr.

I would suggest either setting use_count_ after
dispose(), or clarifying in the docs that
shared_from_this can't be called from a destructor. 

It would also be handy to have an exception-less
version of share_from_this which justs returns a null
shared_ptr, kind of like how shared_ptr::get doesn't throw.

Thanks for any help. ... Michael Ost

PS: code looks something like this (warning:
uncompiled, untested!) ...

class T : public enable_shared_from_this {
public:
   T() {}
   ~T()
   {
      shared_ptr<T> ptr = shared_from_this(); 
      // trouble: exception, can't get a shared_ptr
   }
};

main()
{
   shared_ptr<T> ptr = shared_ptr(new T());
   ptr.reset();
}


Attachments

Change History

comment:1 Changed 11 years ago by murgatroid

Logged In: YES 
user_id=778087

I submitted this as user murgatroid, email
most@museresearch.com. Somehow that didn't get recorded...?

comment:2 Changed 11 years ago by pdimov

  • Status changed from assigned to closed
Logged In: YES 
user_id=305912

This behavior is by design. Since the destructor will destroy 
the object, it is not safe to create a shared_ptr to it as it will 
become dangling once the destructor ends.

http://news.gmane.org/onethread.php?
group=gmane.comp.lib.boost.user&root=%3Cb9rpga%
2Bmo3h%40eGroups.com%3E
View

Add a comment

Modify Ticket

Change Properties
<Author field>
Action
as closed
The resolution will be deleted. Next status will be 'reopened'
Author


E-mail address and user name can be saved in the Preferences.

 
Note: See TracTickets for help on using tickets.