повысить утечку ptr_container при выпуске? - PullRequest
2 голосов
/ 27 января 2012

Я предполагаю, что объект, выпущенный из ptr_set, просочился, если он не был удален вручную.Однако в приведенной ниже тестовой программе показаны только 2 утечки в valgrind (из строк 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

1 Ответ

2 голосов
/ 27 января 2012

Деструктор 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

...