Boost logo

Boost :

Subject: Re: [boost] casting a shared_ptr from void with custom deleter
From: Kenny Riddile (kfriddile_at_[hidden])
Date: 2009-03-20 18:07:53


Christopher Currie wrote:
> On Fri, Mar 20, 2009 at 7:03 AM, Peter Dimov <pdimov_at_[hidden]> wrote:
>> Kenny Riddile:
>>> I'm trying to do something like this:
>>>
>>> boost::shared_ptr<const Foo> fooPtr( boost::static_pointer_cast<const
>>> Foo>(typeErasedFoo), CustomDeleter<const Foo>() );
>>>
>>> where typeErasedFoo is of type:
>>>
>>> boost::shared_ptr<const void>
>
> Just to clarify Peter's point, deletion policy decisions should be
> made at initialization time, not as a part of a type conversion. So,
> your original object construction, which you don't show, should set
> your custom deleter when you create the pointer that receives your
> "new Foo".
>
> A custom deleter is a part of the underlying "value" of the smart
> pointer, and as such are preserved across casts, so there shouldn't be
> a need for the kind of call you're trying to do. The code below
> demonstrates what I mean:
>
> #include <iostream>
> #include <boost/shared_ptr.hpp>
>
> struct Foo{};
>
> struct FooDeleter{
> void operator()( Foo* f ) {
> std::cout << "Goodbye, cruel world!";
> delete f;
> }
> };
>
> int main() {
>
> boost::shared_ptr<Foo> pFoo;
>
> {
> boost::shared_ptr<void> pVoid;
>
> {
> boost::shared_ptr<Foo> pTmp( new Foo, FooDeleter() );
> pVoid = pTmp;
> }
>
> pFoo = boost::static_pointer_cast<Foo>( pVoid );
>
> }
>
> // emits "Goodbye, cruel world!" when pFoo is destructed.
> }
>
> Naturally, you don't have to use a shared_ptr<Foo> when you first
> allocate the Foo object, it's perfectly valid for the pTmp variable to
> be eliminated and simply declare: boost::shared_ptr<void> pVoid( new
> Foo, FooDeleter() );
>
> HTH,
> Christopher
> _______________________________________________
> Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost
>

Ya, this all makes perfect sense and I was just being stupid due to lack
of sleep. I've got it working now (with much simpler code). Thanks guys!


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