2012-01-27 53 views
2

我假设从ptr_set发布的对象泄漏,如果它不是手动删除。但是,下面的测试程序只显示valgrind中的两处泄漏(来自第9/13行),并且第12行没有泄漏。我误解了release,或者是ptr_container设法以某种方式进行清理?boost'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"; 
} 

输出:

'4' has been released 

回答

2

的3析构函数确实是被称为就像你观察到。原因是s.release返回一个智能指针,当指针超出范围时它将删除该对象。所以,你行:

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

类似于编写

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

对象4没有破坏,因为你告诉你的智能指针old_int1没有做到这一点。

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