Mit .reset () einem boost :: shared_ptr mit Alleineigentum zu befreien
-
03-07-2019 - |
Frage
Ich bin Speicher ein Objekt (TTF_Font
) in einem shared_ptr
, die von einem Dritt API mich zur Verfügung gestellt. Ich kann nicht neu verwenden oder auf dem Objekt löschen, so dass der shared_ptr
ist auch einen „Befreiung“ Funktors zur Verfügung gestellt.
// 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() );
Wenn später, ich brauche dieses Objekt explizit zu befreien ist es richtig, dies zu tun:
screenFont.reset();
Und dann lassen screenFont
(das tatsächliche shared_ptr
Objekt) natürlich zerstört werden?
Lösung
shared_ptr <> :: reset () wird die refcount von einem fallen. Wenn das in der Zählung auf Null fallen ergibt, die Ressource durch die Shared_ptr wies <> wird befreit werden.
So ich die Antwort denken, für Sie ist, wird ja das funktioniert. Oder Sie können einfach lassen Den Bildschirm Variable aufgrund zerstört wird dropping out of scope oder was auch immer, wenn es das ist, was zu geschehen.
Um klar zu sein, die normale Nutzung von shared_ptr <> ist, dass man es natürlich zerstört werden lassen, und es wird mit dem refcount und die Freigabe der Ressource beschäftigen, wenn es natürlich auf Null fällt. reset () ist nur erforderlich, wenn Sie diese bestimmte Instanz der gemeinsam genutzten Ressource vor dem Shared_ptr freizugeben brauchen <> würde natürlich zerstört werden.
Andere Tipps
Mike B Ihre Frage beantwortet, also werde ich einfach kommentieren Sie den Code. Wenn TTF_OpenFont
nicht null zurückkehrt, oder wenn TTF_CloseFont
nulls harmlos umgehen kann, brauchen Sie keine CloseFont
Klasse überhaupt, nur &TTF_CloseFont
verwenden.