Boost logo

Boost Users :

Subject: Re: [Boost-users] boost shared_ptr with own dtor
From: Lars Viklund (zao_at_[hidden])
Date: 2012-12-08 12:43:40


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.

-- 
Lars Viklund | zao_at_[hidden]

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