2012-01-27 2 views
2

ptr_setからリリースされたオブジェクトが手動で削除されていない場合は、そのオブジェクトがリークしていると仮定しています。しかし、以下のテストプログラムでは、バググルンド(9/13行目)に2つのリークだけが表示され、12行目にはリークはありません。releaseを誤解しましたか、何らかの理由でクリーンアップを管理していますか?ptr_containerptr_containerが 'release'でリークする?

#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がスマートポインタを返します。スマートポインタは、そのポインタがスコープから外れるとオブジェクトを削除します。だから、あなたの行:あなたはそれを行うにはないold_int1あなたのスマートポインタを伝えるため

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

はオブジェクト4

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

を書くことに似ていますが破壊されていません。

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

関連する問題