删除向量中的指针

Delete pointers in a vector

这是删除向量中指针的正确方法吗?使用索引而不是迭代器可以吗?

    std::vector<int*> stuff;
    int *a = new int(10);
    int *b = new int(20); 
    int *c = new int(30);

    stuff.push_back(a);
    stuff.push_back(b);
    stuff.push_back(c);

    for (int i = 0; i < stuff.size(); i++ ){
        delete (stuff[i]); // doesn't erase
    }
    stuff.clear();
    

Is this a right way of deleting pointers in a vector?

您的代码按预期执行(并且内存已正确删除)。

Is it ok to use indices instead of itertors?

是的。

也就是说,使用迭代器访问向量元素已添加到语言中以避免索引错误(这是一些最常见的错误来源)。

由于您使用的是指针向量(并且我假设您通过索引访问元素以避免将迭代器取消引用为指针的情况),请考虑使用 std::for_each 进行迭代。

这是删除向量中指针的正确方法吗?是的。使用索引而不是迭代器可以吗?是的

当您进入循环时,向量的大小为 3,您将访问存储在其中的 3 个元素。在短时间内,您会有悬空指针,但是,因为您不访问它们,所以这不是问题。

但是,如果我在代码审查中遇到这种情况,我会拒绝它。 如果您的陈述是删除所有实例,为什么不更清楚地显示您遍历所有实例:

for (int *p : stuff)
    delete p;

或者更好的是,你为什么不表明有所有权?

std::vector<std::unique_ptr<int>> stuff;
stuff.push_back(std::make_unique<int>(10));
stuff.push_back(std::make_unique<int>(20));
stuff.push_back(std::make_unique<int>(30));

stuff.clear();

这段代码更短,也更容易维护。如您所见,没有任何明确的删除调用。但是,它确实作为清除的一部分发生。

与你的隐含问题相反,如果我删除了这个指针,我该如何删除迭代器,这将在你删除迭代器时自动删除指针。