我在std::list<BunnyInfo> bList;
是结构的类中有一个定义为BunnyInfo
这样的列表,私有(private)的
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<BunnyInfo>
,因此其insert
会复制要插入的对象,并且erase
会自动处置该副本。因此,您不需要,也不能在该副本上使用delete
。
由于您的add
用new
分配了一个不包含delete
的对象(并且不存储在任何数据结构中),因此add
中存在内存泄漏。
如果要将指针存储在列表中,则需要将列表声明为std::list<BunnyInfo *>
。