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
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.
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));
}
}