2

我假设ptr_set如果未手动删除从 a 释放的对象,则会泄漏该对象。但是,下面的测试程序仅显示 valgrind 中有 2 个泄漏(从第 9/13 行开始),第 12 行没有泄漏。我误解了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";
}

输出:

'4' has been released
4

1 回答 1

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

于 2012-01-27T14:41:24.630 回答