我想正确删除矢量的所有元素。我需要以你在下面看到的方式填充结构向量的向量,每次创建一个新的struct向量来调用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分配的新对象,但我不知道如何正确执行。
答案 0 :(得分:3)
您使用new分配的唯一对象是std::vector<node> *temp;
。
您使用delete temp;
向量删除它自己的析构函数将处理其内容的销毁。但是每次打电话给新人都必须这样做。在这种情况下,您可以分配内部循环,因此您需要在循环结束时调用delete。
但是因为temp
仅在范围内使用,所以不需要动态分配它。您可以在堆栈上分配它:{{1}}。然后当它超出范围时会被自动销毁(在这种情况下,在功能结束时)。
在你的代码中,你分配temp 10次,但是你先泄漏9因为你没有将它们的指针存储在任何地方(因此不能再删除它们)。您始终会覆盖先前temp的指针。在代码的最后,你试图删除最后一个temp的内容(你不能因为内容不是指针)而不是矢量本身。
要实现您要做的事情,您需要做的是将所有临时指针存储在std::vector<node> temp;
中,最后删除内部的每个向量。但如果您根本不使用任何指针,那么您将拥有更好的代码。
此外,您有两个使用相同循环变量的嵌套循环。它可能不会像你想象的那样有效。
答案 1 :(得分:2)
我想正确删除载体的所有元素
由于分配内存的奇怪方式,无法释放所有内容。您动态分配temp
指向的向量,然后在循环的下一次迭代中覆盖指向它的指针。就是这样,一旦你的指针记录消失了,你就无法释放它。
我需要填充结构向量的向量
在这种情况下,您应首先创建vector<vector<node>>
。如果没有矢量矢量,则无法填充矢量矢量,并且当前代码没有矢量。
答案 2 :(得分:0)
如果您没有保存指向新创建的矢量的指针,请在此处创建:
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()