Problems using member function as custom deleter with 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));
}
}