Opened 19 years ago
Closed 19 years ago
#147 closed Support Requests (Rejected)
shared_from_this fails in a destructor
Reported by: | nobody | Owned by: | Peter Dimov |
---|---|---|---|
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(); }
Change History (2)
comment:2 by , 19 years ago
Status: | assigned → 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
Note:
See TracTickets
for help on using tickets.