Повысить утечку ptr_container при выпуске?
Я предполагаю, что объект, который выпущен из ptr_set
утечка, если она не удалена вручную. Однако в приведенной ниже тестовой программе показаны только 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
1 ответ
Решение
Деструктор 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