À l'aide de .reset() pour libérer un boost::shared_ptr avec la propriété exclusive
Je suis le stockage d'un objet (TTF_Font
) dans un shared_ptr
qui m'est fournie à partir d'un tiers de l'API. Je ne peux pas utiliser de nouvelles ou de les supprimer de l'objet, de sorte que le shared_ptr
est également fourni un de "libérer" foncteur.
//Functor
struct CloseFont
{
void operator()(TTF_Font* font) const
{
if(font != NULL) {
TTF_CloseFont(font);
}
}
};
boost::shared_ptr<TTF_Font> screenFont;
screenFont = boost::shared_ptr<TTF_Font>( TTF_OpenFont("slkscr.ttf", 8), CloseFont() );
Si, plus tard, je dois explicitement gratuit cet objet est-il correct de faire cela:
screenFont.reset();
Puis laissez screenFont
(le shared_ptr
objet) être détruit naturellement?
Vous devez vous connecter pour publier un commentaire.
shared_ptr<>::reset() va baisser le refcount par un. Si cela se traduit par le comte de descendre à zéro, la ressource pointée par le shared_ptr<> seront libérés.
Donc je pense que la réponse est oui, cela fonctionne. Ou vous pouvez simplement laisser le screenFont variable d'être détruite suite à une chute hors de portée ou quoi, si c'est ce qui est sur le point d'arriver.
Pour être clair, l'utilisation normale de shared_ptr<>, c'est que vous vous permettez d'être détruite, naturellement, et il va régler le refcount et de libérer de la ressource quand il descend à zéro naturellement. reset() n'est nécessaire que si vous avez besoin de libérer cette instance particulière de la ressource partagée avant le shared_ptr<> serait naturellement été détruits.
Mike B a répondu à votre question, donc je vais juste commenter votre code. Si
TTF_OpenFont
ne retourne pas null, ou siTTF_CloseFont
peut manipuler sans danger les valeurs null, vous n'avez pas besoin d'unCloseFont
classe à tous, il suffit d'utiliser&TTF_CloseFont
.