Boost logo

Boost Users :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2005-04-11 13:40:18


Daniel Lidström wrote:
> Hello,
>
> I want to use the shared_ptr with objects that are allocated using
> a factory. The problem is the deallocation. It has to be done with
> a ``manager'' class. For example, here is how the allocation and
> deallocation has to be done:
>
> PxyFileData& geo_file =
> dynamic_cast<PxyFileData&>(fileMan.New("geo"));
> fileMan.Close(geo_file);
>
> I would like to be able to put shared_ptr<PxyFileData>'s into a
> std::vector and then forget about the deallocation. I.e.
> fileMan.Close(...) should be done automatically when the objects
> aren't needed anymore. But since the deallocation isn't simply
> delete, how can I do this?

I assume that FileMan::Close is

    void FileMan::Close( FileData& data );

If it took a pointer as an argument, things would be simple:

    shared_ptr<PxyFileData> p( &geo_file,
        boost::bind( &FileMan::Close, &fileMan, _1 )
    );

But since you need a reference, you'd need to use boost::lambda::bind:

namespace ll = boost::lambda;

    shared_ptr<PxyFileData> p( &geo_file,
        ll::bind( &FileMan::Close, &fileMan, *ll::_1 )
    );

or write your own function object:

    struct fm_close
    {
        typedef void result_type;

        void operator()( FileMan * pfm, FileData * pfd ) const
        {
            pfm->Close( *pfd );
        }
    };

    shared_ptr<PxyFileData> p( &geo_file,
        boost::bind( fm_close(), &fileMan, _1 )
    );

or maybe

    struct fm_close
    {
        FileMan * pfm_;

        explicit fm_close( FileMan * pfm ): pfm_( pfm ) {}

        void operator()( FileData * pfd ) const
        {
            pfm_->Close( *pfd );
        }
    };

    shared_ptr<PxyFileData> p( &geo_file, fm_close( &fileMan ) );


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