2012-01-27 2 views
2

ptr_set에서 릴리스 된 객체가 수동으로 삭제되지 않으면 유출되었다고 가정합니다. 그러나 아래의 테스트 프로그램은 valgrind (9/13 줄부터)에서 누출 2 개만 표시하고 12 번째 줄에서는 누출이 없음을 나타냅니다. release을 오해 했습니까? 아니면 ptr_container을 정리하는 중입니까?'release'에서 ptr_container 누출을 향상 시키시겠습니까?

#include <iostream> 
#include <boost/ptr_container/ptr_set.hpp> 

typedef boost::ptr_set<int> SetInt; 

int main() { 
    SetInt s; 

    new int(1);    // leak, reported by valgrind 

    s.insert(new int(2)); 
    s.insert(new int(3));  // leak? not reported by valgrind 
    s.insert(new int(4));  // leak, reported by valgrind 

    s.erase(s.begin()); 
    s.release(s.begin());  // release '3' 

    SetInt::auto_type old_int1 = s.release(s.begin()); 
    int *old_int2 = old_int1.release(); 
    std::cout << '\'' << *old_int2 << "' has been released\n"; 
} 

출력 :

3의 소멸자는 실제로 당신이 관찰하는 것처럼라고
'4' has been released 

답변

2

. 이유는 s.release가 포인터가 범위를 벗어날 때 객체를 삭제하는 스마트 포인터를 반환하기 때문입니다. 그래서, 당신의 라인 :

s.release(s.begin());  // release '3' 

당신이 당신의 스마트 포인터가 그것을 할 수 없습니다 old_int1 말 때문에

{  
    SetInt::auto_type tmp= s.release(s.begin());  // release '3' 
} // at this point the '3' is destroyed. 

오브젝트 (4)이 파괴되지 작성과 유사합니다.

http://www.boost.org/doc/libs/1_34_0/libs/ptr_container/doc/tutorial.html#new-functions