L'aide personnalisée deleter avec std::shared_ptr
Je suis en train de travailler sur la façon d'utiliser std::shared_ptr avec une coutume deleter. Plus précisément, je l'utilise avec SDL_Surface comme:
std::shared_ptr<SDL_Surface>(SDL_LoadBMP(....),SDL_FreeSurface);
qui compile et fonctionne très bien. Cependant, je voudrais essayer mon propre deleter et ne peut pas travailler sur la façon de le faire. La documentation pour SDL_FreeSurface se trouve ici:
http://sdl.beuc.net/sdl.wiki/SDL_FreeSurface
dans lequel je trouve le SDL_FreeSurface est déclarée comme suit:
void SDL_FreeSurface(SDL_Surface* surface);
Comme un test, et en passant par cette information, j'ai essayé la fonction suivante:
void DeleteSurface(SDL_Surface* surface)
{
std::cout << "Deleting surface\n";
SDL_FreeSurface(surface);
}
Cependant, la compilation avec g++ me donne l'erreur suivante:
error: no matching function for call to 'std::shared_ptr<SDL_Surface>::shared_ptr(SDL_Surface*, <unresolved overloaded function type>)'
J'ai regardé la documentation gnu pour la gcc std::shared_ptr mise en œuvre, mais ne peut pas faire beaucoup de sens. Ce que je fais mal?
EDIT: depuis, j'ai rétréci le problème, mais laisse la question initiale. Ce que j'ai eu était une classe de Jeu qui, si je bande pour la mise en œuvre de base, était quelque chose comme:
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 */
}
avec la mise en œuvre de DeleteSurface
comme ci-dessus, et la mise en œuvre de CacheImages()
comme:
bool CacheImages()
{
mCachedImages.push_back(std::shared_ptr<SDL_Surface>(SDL_LoadBMP(...),DeleteSurface);
return true;
}
qui m'ont donné de l'erreur que j'ai énumérés ci-dessus. Cependant, si je déplace le DeleteSurface()
fonction à l'extérieur de la Game
classe autrement sans le modifier, le code compile. Qu'est-ce y compris la DeleteSurface
fonction dans le Game
classe qui est à l'origine des problèmes?
- Votre exemple compile très bien pour moi.
Vous devez vous connecter pour publier un commentaire.
ou
EDIT:
Voir mise à jour de votre question,
DeleteSurface
devrait être un non-membre de la fonction, sinon vous devez utiliserstd::bind
oustd::mem_fn
ou une autre fonction membre pointeur de carte.Game
, qui sera le pointeur d'objet parthis
à l'intérieur de la fonction membre.shared_ptr
a aucune instance deGame
lorsqu'il appelle la deleter fonction.=
dans votre lambda groupe de capture; je l'ai trouvé confus.Ce code fournit un exemple d'un pointeur partagé avec la construction de la deleter comme une méthode de l'objet. Il affiche le
std::bind
instruction pour l'utiliser.L'exemple est un objet simple recycleur. Lorsque la dernière référence à l'objet est détruit, l'objet est retourné à l'objet libre de la piscine à l'intérieur du recycleur.
La recyler peut être facilement changé en un objet cache en ajoutant une touche pour le
get()
etadd()
méthodes et de stocker les objets dans unstd::map
.get()
, vous aurez toujours obtenir un pointeur partagé avec un nombre de références1
. Ce qui est pire, plusieurs pointeurs partagés pouvez ensuite pointer vers la même mémoire. Si l'on est hors de portée, vous obtiendrez des erreurs de segmentation. Ce dont vous avez besoin n'est pas unestd::vector<Obj*>
, mais unstd::vector<std::weak_ptr<Obj>>
.std::vector<std::weak_ptr<Obj>>
que ça ne pourra pas préserver la durée de vie de la mémoire tampon que vous souhaitez réutiliser, vous voulez unstd::vector<std::unique_ptr<Obj>>
à la place. vous pouvez impliticly créer unstd::shared_ptr
de votre pré-existantstd::unique_ptr
et puis la coutume deleter pouvez alors prendre le raw maintenant-propriétaire pointeur et la placer dans un nouveaustd::unique_ptr
et placez-la dans votrestd::vector
.