这是我程序中的代码
#include <iostream>
#include <string>
#include <list>
int main()
{
std::list<int *> list;
//populating the list with some pointers
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
for(std::list<int *>::iterator iter = list.begin(); iter != list.end(); iter++)
{
delete(*iter);
list.erase(--iter);
}
// trying to print the list contents
for(std::list<int *>::iterator iter = list.begin(); iter != list.end(); iter++)
{
std::cout<<*iter<<std::endl;
}
}
这是正确的做法吗?
答案 0 :(得分:2)
在迭代时修改列表是一个非常糟糕的主意。
此外,每次通过列表,您递减ROWGUIDCOL
然后在for语句中递增它 - 所以它永远不会移动。
我认为你需要做的是重复循环删除指针,然后清除整个列表。
iter
更好的是,将列表设为unique_ptrs列表,这样更容易:
for (const auto p: list)
delete p;
p.clear();
记住口头禅:如果你能避免,就不要写裸体。
答案 1 :(得分:0)
首先你的方法不仅错误而且可怕!这是因为您正在删除列表中的对象&amp;然后使用std::cout
打印它们导致UB。其次,您在遍历它们的迭代器上使用erase
。擦除迭代器后,它会使它失效。对它的引用。因此,再次使用invalid iterators
会导致UB。
接下来,您无需删除容器中的每个元素。容器适用于RAII principle
&amp;因此将自动释放他们的资源。所以你的擦除代码减少到: -
for (auto itr = l.begin(); itr!=l.end(); ++itr)
{
delete *itr;
}
在C ++中使用迭代器时需要非常小心,因为无论它们有多么有用,它们对于初学者来说都不容易使用。但是当你了解它们时,你会发现使用它们的舒适度。可能也喜欢他们!