2012-03-12 4 views
1

У меня есть список, определенный как таковой std::list<BunnyInfo> bList;, частные, в классе, где BunnyInfo является структуройВысвобождение член станд :: список

struct BunnyList::BunnyInfo { 
    std::string name; 
    char gender; 
    std::string color; 
    unsigned int age : 6; // 0 - 63 
    bool mutant; 
}; 

где список растет с помощью функции-члена

void BunnyList::add(int count){ 
    bListIter iter; 
    while(count--){ 
     BunnyInfo *bNew = &fill(*new BunnyInfo()); 
     for(iter = bList.begin(); iter != bList.end(); iter++){ 
      if(iter->age <= bNew->age) 
       break; 
     } 
     bList.insert(iter, *bNew); 
    } 
} 

где fill() - это просто функция, которая генерирует значения для структуры. У меня также есть функция-член, которая удаляет половину списка

void BunnyList::reap(){ 
    int toKill = bList.size()/2; 
    int find; 
    bListIter iter; 
    while(toKill--){ 
     find = rng(0, bList.size()-1); 
     iter = bList.begin(); 
     for(int i = 0; i < find; i++) // traverse list to the find-th node; 
      iter++; 
     delete &(*iter); 
     bList.erase(iter); 
    } 
} 

Мой вопрос, как я бы удалить элемент списка и в то же время освободить ресурсы, выделенные с помощью add(). delete &(*iter); вызывает ошибку, я думаю, так как без нее программа работает нормально. Но просто вызов erase() не освобождает BunnyInfo, связанный с узлом списка.

Я новичок в использовании STL.

+0

Возможно, вы захотите избежать 'std :: list', если у вас нет особых причин использовать его. ('std :: vector' превосходит практически все) –

+0

Почему ваша функция добавления выделяет динамический BunnyInfo вместо того, чтобы просто создавать локально? –

+0

Ну, список сортируется через 'age', поскольку список растет; Я делаю вставки в середине много, поэтому я считаю, что вектор будет менее идеальным. (?) – lightburst

ответ

5

Поскольку список объявлен std::list<BunnyInfo>, его номер insert делает копию подлежащего введению объекта, а erase автоматически удаляет копию. Таким образом, вам не нужно и не может использовать delete на этой копии.

Поскольку ваши add alloctes с new объекта, который он не delete (и не хранит в любой структуре данных), существует утечка памяти в add.

Если вы хотите сохранить указатели в списке, вам необходимо объявить список std::list<BunnyInfo *>.