c++ - 从指针 vector 中删除内容

标签 c++ pointers vector

我有一个这样的指针 vector :

vector<Item*> items;

我想清除它。我试过:

for (unsigned int i = 0; i < items.size(); i++)
    delete items.at(i);
items.clear();

,

while (!items.empty())
{
    delete items.back();
    items.pop_back();
}

,

while (!items.empty())
{
    delete items.at(0);
    items.erase(items.begin());
}

while (!items.empty())
    delete items.at(0);

由于某种原因,其中的每一个都会爆炸,包括删除已删除的对象和超出范围的 vector 迭代器。

我该怎么办?我希望能够重用同一个 vector ,并在以后向其中添加更多 Item 指针。只使用 delete 而不清除仍然会留下垃圾指针,对吗?

编辑:好的,我已经切换到 shared_ptrs。现在我有

vector<shared_ptr<Item> > items;

然而,当我执行 items.clear(); 时,我收到错误“vector 迭代器不兼容”。我还做错了什么?

最佳答案

我对你们所有删除内容的方法进行了测试,但其中一种根本行不通。请参阅下面的代码以获取对它们的评论。

为了回答您的问题“我该怎么做”,以下是我在删除时出现段错误时所做的事情:
1)确定内存是我的(我知道对应的new在哪里吗)?
2)确保我没有删除内存(如果我删除了,即使它是我的,现在也不是)。

3) 如果您非常确定您的段错误是由代码的单个部分引起的,请将其分解为另一个项目中的一个小测试用例(就像您在问题中所做的那样)。然后玩它。如果您在一个小项目中运行您的代码示例,您会在最后一个项目中看到段错误,并且您会注意到删除在所有其他情况下都有效。像这样分解代码会让你知道你需要跟踪你是如何将它们存储在你的 vector 中的,以查看你在哪里失去了它们的所有权(通过删除,或将它们传递给删除它们的东西,等等...... ).

旁注:正如其他人所说,如果您可以使用智能指针,他们会为您管理内存。但是,请在这里继续学习并了解如何使用愚蠢的指针。有时您无法导入 boost,或者让 QT 为您进行内存管理。此外,有时您必须将指针存储在容器中,所以也不要害怕这样做(即:QT 开发人员强烈建议使用指针来存储小部件,而不是引用或任何类似的东西)。

#include <vector>

using namespace std;
class Item
{
public:
    int a;
};

int main()
{
    vector<Item *> data;

    for(int x = 0; x < 100; x++)
    {
        data.push_back(new Item());
    }

    //worked for me, and makes sense
    for(int x = 0; x < 100; x++)
    {
        delete data.at(x);
    }
    data.clear();

    for(int x = 0; x < 100; x++)
    {
        data.push_back(new Item());
    }
    //worked for me, and makes sense
    while (!data.empty())
    {
        delete data.back();
        data.pop_back();
    }
    data.clear();

    for(int x = 0; x < 100; x++)
    {
        data.push_back(new Item());
    }

    //  //worked for me, and makes sense
    while (!data.empty())
    {
        delete data.at(0);
        data.erase(data.begin());
    }

    for(int x = 0; x < 100; x++)
    {
        data.push_back(new Item());
    }

//  //This one fails, you are always trying to delete the 0th position in
//  //data while never removing an element (you are trying to delete deleted memory)
//  while (!data.empty())
//  {
//      delete data.at(0);
//  }


    return 0;
}

关于c++ - 从指针 vector 中删除内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10237927/

相关文章:

c++ - 迭代器是否失效?

c++ - 从基类对象的 vector 中获取特定派生类的对象

c++ - 不使用 Visual C++ 编译 c++ Visual C++ 7.1 解决方案

c++ - 当其他库仍在使用时如何删除动态库中的指针

c++ - 在 C++ 中对 vector 进行分组排序

c++ - C++ 中是否有类似于 Objective C 属性的类比

c - C中带符号数的数组索引

c - Far在c语言中是什么意思?

vector - 如何为向量的迭代器元素添加 Into 的类型注释?

c++ - vector 增长时如何强制执行 move 语义?