как освободить память из набора - PullRequest
1 голос
/ 23 сентября 2010

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

Ответы [ 3 ]

7 голосов
/ 23 сентября 2010

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

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

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

В Boost имеется библиотека Pointer Container , которая решает эту проблему.

4 голосов
/ 23 сентября 2010

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

3 голосов
/ 23 сентября 2010

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

...