weak_ptr unique_ptr smart shared_ptr pointer example create c++ shared-ptr

smart - unique_ptr c++



Usar el eliminador personalizado con std:: shared_ptr (2)

Estoy tratando de averiguar cómo usar std :: shared_ptr con un eliminador personalizado. Específicamente, lo estoy usando con SDL_Surface como:

std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);

que compila y funciona bien. Sin embargo, me gustaría probar mi propio eliminador y no puedo encontrar la forma de hacerlo. La documentación para SDL_FreeSurface se encuentra aquí:

http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface

en el que encuentro el SDL_FreeSurface se declara como:

void SDL_FreeSurface(SDL_Surface* surface);

Como prueba, y siguiendo esa información, probé la siguiente función:

void DeleteSurface(SDL_Surface* surface) { std::cout << "Deleting surface/n"; SDL_FreeSurface(surface); }

Sin embargo, compilar con g ++ me da el siguiente error:

error: no matching function for call to ''std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)''

He consultado la documentación de gnu para la implementación de gcc std :: shared_ptr pero no puedo darle mucho sentido. ¿Qué estoy haciendo mal?

EDIT: Desde entonces he reducido el problema, pero voy a dejar la pregunta original anterior. Lo que tenía era una clase de Juego que, si lo despojara de una implementación básica, era algo así como:

class Game { public: /* various functions */ private: void DeleteSurface(SDL_Surface* surface); bool CacheImages(); std::vector<std::shared_ptr<SDL_Surface> > mCachedImages; /* various member variables and other functions */ }

con la implementación de DeleteSurface como se DeleteSurface anteriormente, y la implementación de CacheImages() como:

bool CacheImages() { mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface); return true; }

que me juego el error que enumeré arriba. Sin embargo, si muevo la función DeleteSurface() fuera de la clase Game sin modificarla, el código se compila. ¿De qué se trata al incluir la función DeleteSurface en la clase Game que está causando problemas?


Este código proporciona un ejemplo de construcción de un puntero compartido con el eliminador como método de objeto. std::bind instrucción std::bind para usar.

El ejemplo es un simple reciclador de objetos. Cuando se destruye la última referencia al objeto, el objeto se devuelve al grupo de objetos libres dentro del reciclador.

El reciclador se puede cambiar fácilmente en un caché de objetos al agregar una clave a los métodos get() y add() y al almacenar los objetos en un 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)); } }


std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....), [=](SDL_Surface* surface) { std::cout << "Deleting surface/n"; SDL_FreeSurface(surface); });

o

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

EDITAR:

Al ver su pregunta actualizada, DeleteSurface debe ser una función que no sea miembro, de lo contrario debe usar std::bind o std::mem_fn o algún otro adaptador de puntero a función miembro.