Boost logo

Boost Users :

Subject: Re: [Boost-users] boost shared_ptr with own dtor
From: Andrew Holden (andrewholden1_at_[hidden])
Date: 2012-12-08 13:34:18


Philipp Kraus <philipp.kraus_at_[hidden]> wrote:

>
>Am 08.12.2012 um 18:43 schrieb Lars Viklund:
>
>> On Sat, Dec 08, 2012 at 06:24:08PM +0100, Philipp Kraus wrote:
>>> On 2012-12-08 17:45:07 +0100, Andrew Holden said:
>>>> I would ini tialize the shared pointer like so:
>>>>
>>>> boost::shared_ptr <MyType> ptr;
>>>>
>>>> MyType *temp_ptr = cptr_open(); //Use a temporary pointer to avoid
>
>>>> initializing the shared pointer with null.
>>>>
>>>> if (temp_ptr)
>>>> ptr.reset(temp_ptr, &cptr_close);
>>>> //Now discard temp_ptr
>>>
>>> O
>>>
>http://www.boost.org/doc/libs/1_52_0/libs/smart_ptr/shared_ptr.htm#constructors
>
>>> I found that I can use a ctor with
>>> template<class Y, class D> shared_ptr(Y * p, D d);
>>> and D is a dtor call. Do you have an example for D ?
>>
>> 'D' can be any type whose value 'd' is callable as d(p). This
>includes,
>> but is not limited to:
>> D: std::function<void (Y*)> // friendly wrapper around callables
>> D: void (*)(Y*) // regular function pointer to say void f(Y* p);
>> D: struct D { void operator () (Y* p) const; };
>> d: [](Y* p) { .. } // lambdas are neat
>>
>> In your case, Andrew outlined how you can pass in a function pointer
>to
>> your cptr_close, assuming that it has a suitable signature.
>>
>> The D used in reset() adheres to the same rules as the one in the
>> constructor your found, namely that it'll be invoked when the last
>> sibling shared_ptr perishes.
>
>
>I'm using the ctor call
>boost::shared_ptr<mycptr> x ( cptr_open(), cptr_close );
>
>this seems to be working at the moment
>
>Thx
>
>Phil
>_______________________________________________
>Boost-users mailing list
>Boost-users_at_[hidden]
>http://lists.boost.org/mailman/listinfo.cgi/boost-users

That will work unless cptr_open() returns NULL. If I recall, if cptr_open() returns NULL, then the shared_ptr will report it is initialized correctly even though it contains a NULL pointer, and will call cptr_close (NULL) when it goes out of scope.



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net