Boost logo

Boost :

Subject: Re: [boost] [smart_ptr] enable_shared_from_this and shared_ptr to a base class
From: Adam Romanek (romanek.adam_at_[hidden])
Date: 2013-06-24 03:22:46


On 06/24/2013 08:52 AM, Andrey Semashev wrote:
> On Mon, Jun 24, 2013 at 10:28 AM, Adam Romanek <romanek.adam_at_[hidden]>wrote:
>>
>> class X
>> {
>> ...
>> };
>>
>> class Y: public X, public boost::enable_shared_from_**this<Y>
>> {
>> ...
>> };
>>
>> int main()
>> {
>> X* x_ptr = new Y;
>> boost::shared_ptr<X> sp(x_ptr);
>> sp->foo();
>> }
>
> This is expected, given the way it's implemented and described.
> shared_from_this() description [1] mentions that there must be at least one
> shared_ptr that owns the object. I didn't find any formal definition of the
> "owns" relation but it doesn't look to me that it applies to your example,
> because there is no shared_ptr pointing to Y in your code.
>
> [1]
> http://www.boost.org/doc/libs/release/libs/smart_ptr/enable_shared_from_this.html

Andrey!

Thanks for such a quick response.

OK, this behavior may in fact be expected considering the
implementation. However, I would not say the documentation reflects
that. But let's look at the code first.

You wrote that there is no shared_ptr pointing to Y in my code. I can't
agree. There is - sp. It points to Y through a pointer to X, which is
perfectly valid. Moreover, in my opinion it "owns" an instance of Y and
will attempt to destroy it when necessary.

Maybe it's a matter of using the right words but a colleague of mine
spent an hour or two looking for a bug in his code, just to find out
about this "feature" of enable_shared_from_this.

I appreciate your explanation but still, I think that the documentation
is a bit imprecise and could be improved so that things were more clear.

WBR,
Adam Romanek


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk