我可以删除和删除指针列表,如下所示

时间:2015-12-12 15:54:57

标签: c++ list pointers iterator

这是我程序中的代码

    #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;
        }

    }

这是正确的做法吗?

2 个答案:

答案 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 ++中使用迭代器时需要非常小心,因为无论它们有多么有用,它们对于初学者来说都不容易使用。但是当你了解它们时,你会发现使用它们的舒适度。可能也喜欢他们!