문제

나는 객체를 저장하고 있습니다 (TTF_Font) 안에 shared_ptr 이는 타사 API에서 나에게 제공됩니다.객체에 대해 new나 delete를 사용할 수 없습니다. shared_ptr "해제" 기능도 제공됩니다.

// 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() );

나중에 이 객체를 명시적으로 해제해야 하는 경우 다음과 같이 하는 것이 올바른가요?

screenFont.reset();

그리고 나서 screenFont (실제 shared_ptr 객체) 자연적으로 파괴됩니까?

도움이 되었습니까?

해결책

shared_ptr <> :: reset ()는 refcount를 하나씩 떨어 뜨립니다. 그 결과로 카운트가 0으로 떨어지면 shared_ptr <>가 가리키는 리소스가 해제됩니다.

그래서 나는 당신을위한 대답은 효과가 있다고 생각합니다. 또는 그 일이 일어나는 일이라면 스크린 폰트 변수를 범위 나 그 무엇이든 탈락하여 파괴 할 수 있습니다.

명확하게 말하면, Shared_ptr <>의 정상적인 사용은 자연스럽게 파괴되도록하고 자연스럽게 0으로 떨어질 때 리소스를 해결하고 리소스를 해제하는 것입니다. Reset ()는 Shared_ptr <>가 자연스럽게 파괴되기 전에 공유 리소스의 특정 인스턴스를 해제 해야하는 경우에만 필요합니다.

다른 팁

Mike B가 귀하의 질문에 답변했으므로 귀하의 코드에 대해서만 설명하겠습니다.만약에 TTF_OpenFont null을 반환하지 않거나 TTF_CloseFont null을 무해하게 처리할 수 있으므로 CloseFont 수업을 전혀 사용하지 마십시오. &TTF_CloseFont.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top