2010-09-23 4 views
0

У меня есть набор, который включает указатели на выделенную память, я использую метод clear для примера: setname.clear(); , и сам набор очищается и его указатели, но я все еще получаю утечки памяти, потому что по какой-то причине выделенная память остается нерасчищенной.Как освободить память из набора

ответ

6

std::setclear() метод удаляет элементы из набора. Однако в вашем случае набор содержит указатели, которые удаляются, но память, на которую они указывают, не освобождается. Вы должны сделать это вручную перед вызовом clear(), например:

struct Deleter 
{ 
    template <typename T> 
    void operator() (T *ptr) 
    { 
    delete ptr; 
    } 
}; 

for_each (myset.begin(), myset.end(), Deleter()); 

Существует библиотека в Boost называется Pointer Container, которая решает эту проблему.

+0

Или, если доступно Boost, попробуйте сделать его набором boost :: shared_ptr (from Boost.SmartPtr: http://www.boost.org/doc/libs/1_44_0/libs/smart_ptr/smart_ptr.htm). По-моему, у TR1 тоже есть smart_ptr. – gregg

+0

shared_ptr будет отличным накладным, если указатель на самом деле не разделен, а просто находится в наборе (во избежание копирования, например). Это было одной из причин создания ptr_container. – 2010-09-23 14:23:55

+0

@ Vlad Lazarenko Что делать, если набор содержит int? – Pegah

4

Set only очищает то, что он сам выделяет. Если вы сами что-то выделяете, вам придется очистить его самостоятельно.

3

Clear() удаляет указатели, а не объекты, на которые он указывает. Вам нужно либо выполнить итерацию по каждому объекту, прежде чем удалить его на delete, либо использовать что-то вроде std::tr1::shared_ptr (также в Boost).

Смежные вопросы