如何删除向量的指针
Posted
技术标签:
【中文标题】如何删除向量的指针【英文标题】:How to delete pointers of vector 【发布时间】:2014-02-06 14:46:29 【问题描述】:我想正确删除我的向量的所有元素。我需要按照您应该在下面看到的方式填充结构向量的向量,每次调用 new
方法时创建一个新的结构向量。
这是我的代码:
struct node
int index;
double value;
struct problem
int l;
struct node **x;
;
struct problem prob; // set by read_problem
std::vector<node *> vettProbX;
int main()
node tmpValue;
std::vector <node> *temp;
for (int i=0; i<10; i++)
temp = new std::vector<node>;
for (int i=0; i<10; i++)
tmpValue.index=i;
tmpValue.value=i;
temp->push_back(tmpValue);
vettProbX.push_back(temp->data());
prob.x=&vettProbX[0];
//Destructor
for(int CC=0; CC<vettProbX.size(); CC++)
delete temp[CC];
return 0;
我想删除所有用 NEW 分配的新对象,但我不知道如何正确执行。
【问题讨论】:
将您的指针存储在:std::unique_ptr
,它将为您处理删除。
我不太明白你的代码,但我理解你的问题this 的方式可能对你有帮助(只需用 std::vector 替换 BinaryTree)。
你想做什么?
temp = new std::vector<node>;
这一行看起来像是内存泄漏的好地方。确保在 i 循环结束时删除 temp。
【参考方案1】:
您使用 new 分配的唯一对象是 std::vector<node> *temp;
。
你用delete temp;
删除它,Vectors 自己的析构函数将处理其内容的破坏。但是每次调用 new 时都必须这样做。在这种情况下,您在循环内分配,因此您需要在循环结束时调用 delete。
但是因为temp
只在作用域内使用,所以不需要动态分配。您可以像这样在堆栈上分配它:std::vector<node> temp;
。然后它会在超出范围时自动销毁(在这种情况下是在函数结束时)。
在您的代码中,您分配了 10 次 temp,但首先泄漏了 9 次,因为您没有将它们的指针存储在任何地方(因此无法再删除它们)。您总是会覆盖先前温度的指针。在代码的末尾,您尝试删除最后一个 temp 的内容(因为内容不是指针,所以不能删除)而不是向量本身。
要实现您想要做的事情,您需要做的是将所有临时指针存储在 std::vector<std::vector<node>* >
中,最后删除其中的每个向量。但是如果你根本不使用任何指针,你会得到更好的代码。
另外,您有两个使用相同循环变量的嵌套循环。它可能无法按您的预期工作。
【讨论】:
这只是我完整代码的主要内容。无论如何我需要动态分配它以用于其他目的。 @user2988113,还有什么用途? 我需要在每次迭代时在 vettProbX 中存储一个指向不同内存段的指针。问题是如何正确删除所有用 new() 创建的指针。 @user2988113 正如这个答案所解释的,你只是用new
创建一个对象,这个答案还告诉你如何删除它。那么问题出在哪里?
@user2988113 在您的代码中,您分配 temp
10 次是的,但是您首先泄漏了 9 次,因为您没有将它们的指针存储在任何地方(因此不能再删除它们)。您总是会覆盖以前的temp
的指针。在代码的末尾,您尝试删除最后一个 temp
的内容(因为内容不是指针,所以不能删除)而不是向量本身。【参考方案2】:
我想正确删除我的向量的所有元素
由于您分配内存的奇怪方式,不可能释放所有内容。您动态分配temp
指向的向量,然后在循环的下一次迭代中覆盖指向它的指针。就是这样,一旦您的指针记录消失了,您就无法释放它。
我需要填充结构向量的向量
在这种情况下,您应该首先创建一个vector<vector<node>>
。如果没有向量,则无法填充向量,而您当前的代码也没有。
【讨论】:
【参考方案3】:如果您不保存指向新创建的向量的指针,请在此处创建:
temp = new std::vector<node>;
那么,没有办法删除它并释放内存。
改变
std::vector<node *> vettProbX;
vettProbX.push_back(temp->data());
到
std::vector<std::vector<node> *> vettProbX;
vettProbX.push_back(temp);
然后你可以将vettProbX
中存储的每一项都一个一个删除
for (int i = 0; i < vettProbX.size(); i++)
delete vettProbX[i];
如果您需要访问这些内存段而不是这样做
vettProbX[i]
您必须调用data
方法
vettProbX[i]->data()
【讨论】:
以上是关于如何删除向量的指针的主要内容,如果未能解决你的问题,请参考以下文章