У меня есть список, определенный как таковой 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.
Возможно, вы захотите избежать 'std :: list', если у вас нет особых причин использовать его. ('std :: vector' превосходит практически все) –
Почему ваша функция добавления выделяет динамический BunnyInfo вместо того, чтобы просто создавать локально? –
Ну, список сортируется через 'age', поскольку список растет; Я делаю вставки в середине много, поэтому я считаю, что вектор будет менее идеальным. (?) – lightburst