Using custom deleter with std::shared_ptr

后端 未结 2 1726
盖世英雄少女心
盖世英雄少女心 2020-12-01 03:46

I\'m trying to work out how to use std::shared_ptr with a custom deleter. Specifically, I\'m using it with SDL_Surface as:

std::shared_ptr         


        
相关标签:
2条回答
  • 2020-12-01 03:58
    std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....), [=](SDL_Surface* surface)
    {
        std::cout << "Deleting surface\n";
        SDL_FreeSurface(surface);
    });
    

    or

    void DeleteSurface(SDL_Surface* surface)
    {
        std::cout << "Deleting surface\n";
        SDL_FreeSurface(surface);
    }
    
    std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....), DeleteSurface);
    

    EDIT:

    Seeing your updated question, DeleteSurface should be a non-member function, otherwise you need to use std::bind or std::mem_fn or some other member function pointer adapter.

    0 讨论(0)
  • 2020-12-01 04:03

    This code provides an example of a shared pointer construction with the deleter as an object method. It display the std::bind instruction to use.

    The example is a simple object recycler. When the last reference to the object is destroyed, the object is returned to the free object pool inside the recycler.

    The recyler can be easily changed into an object cache by adding a key to the get() and add() methods and by storing the objects in a std::map.

    class ObjRecycler
    {
    private:
        std::vector<Obj*> freeObjPool;
    public:
        ~ObjRecycler()
        {
            for (auto o: freeObjPool)
                delete o;
        }
    
        void add(Obj *o)
        {
            if (o)
                freeObjPool.push_back(o);
        }
    
        std::shared_ptr<Obj> get()
        {
            Obj* o;
            if (freeObjPool.empty())
                o = new Obj();
            else
            {
                o = freeObjPool.back();
                freeObjPool.pop_back();
            }
            return std::shared_ptr<Obj>(o, 
                 std::bind(&ObjRecycler::add, this, std::placeholders::_1));
        }
    }
    
    0 讨论(0)
提交回复
热议问题