Question

Je stocke un objet (TTF_Font) dans un shared_ptr qui m'est fourni à partir d'une API tierce.Je ne peux pas utiliser new ou delete sur l'objet, donc le shared_ptr est également fourni un foncteur de "libération".

// 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, j'ai besoin de libérer explicitement cet objet, est-il correct de le faire :

screenFont.reset();

Et puis laisse screenFont (l'actuel shared_ptr objet) être détruit naturellement ?

Était-ce utile?

La solution

shared_ptr<>::reset() supprimera le refcount de un.Si cela entraîne une chute du décompte à zéro, la ressource pointée par shared_ptr<> sera libérée.

Je pense donc que la réponse pour vous est oui, cela fonctionnera.Ou vous pouvez simplement laisser la variable screenFont être détruite en raison d'une sortie de portée ou autre, si c'est ce qui est sur le point de se produire.

Pour être clair, l'utilisation normale de shared_ptr<> est que vous le laissez être détruit naturellement, et il gérera le refcount et libérera la ressource lorsqu'elle tombera naturellement à zéro.reset() n'est requis que si vous devez libérer cette instance particulière de la ressource partagée avant que shared_ptr<> ne soit naturellement détruit.

Autres conseils

Mike B a répondu à votre question, je vais donc commenter votre code. Si TTF_OpenFont ne renvoie pas la valeur null ou si TTF_CloseFont peut gérer les valeurs NULL de manière inoffensive, vous n'avez pas du tout besoin d'une classe CloseFont, utilisez simplement &TTF_CloseFont.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top