Utiliser .reset() pour libérer un boost::shared_ptr en propriété exclusive
-
03-07-2019 - |
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 ?
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
.