2012-01-27 66 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