.reset()을 사용하여 단독 소유권으로 Boost::shared_ptr을 해제합니다.
-
03-07-2019 - |
문제
나는 객체를 저장하고 있습니다 (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
.