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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top