我有一个这样的指针 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/