以下是用于说明我的问题的相同的c ++代码 我知道其他工作方法,但有兴趣知道下面的代码是否错误?
Void pupulatelist()
{
//populating the list with some int pointers,in actual i have some other objects to delete when accessed each time.
for(int i =0;i<5;i++)
{
int *p = new int(i);
list.push_back(p);
}
//want to delete and erase the contents of the above list
// if i dont use erase my actual code is crashing.
for(std::list<int *>::iterator iter = list.begin(); iter != list.end(); ++iter)
{
delete(*iter);
list.erase(iter--);
}
}
答案 0 :(得分:2)
让list.erase
退出for循环更简单,只需在完成所有操作后致电list.clear
。
如果你想保持for循环,需要修复它。它应该是这样的:
for (auto iter = list.begin(); iter != list.end();) {
delete *iter;
iter = list.erase(iter);
}
erase
将一个迭代器返回到被删除的元素之后的元素,因此您不需要在循环中递增。此外,您的原始循环会将其减少到列表开始之前的未定义行为(UB)。