如何删除向量的指针

How to delete pointers of vector

本文关键字:向量 指针 删除 何删除      更新时间:2023-10-16

我想正确删除向量的所有元素。我需要以下面的方式填充结构向量的向量,每次创建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;
}

我想删除分配了新的新对象,但我不知道该如何正确执行。

您已分配给新的唯一对象是std::vector<node> *temp;。您可以使用delete temp;矢量自己的驱动器来处理其内容的破坏。但是,您必须在每次称为新的时做到这一点。在这种情况下,您可以在内部循环内分配,因此需要在循环末端调用删除。

但是,由于temp仅在范围内使用,因此无需动态分配它。您可以在堆栈上分配它:std::vector<node> temp;。然后,当它超出范围时,它将自动破坏(在这种情况下的功能末尾)。

在您的代码中,您将温度分配10次,但是您泄漏了前9个,因为您不在任何地方存储它们的指针(因此无法再删除它们)。您始终覆盖以前的温度的指针。在代码末尾,您尝试删除最后一个温度的内容(因为内容不是指针,而不是向量本身。

要实现您要做的事情,您需要做的就是将所有临时指针存储在std::vector<std::vector<node>* >中,最终将每个向量删除内部。但是,如果您根本不使用任何指针,您的代码会更好。

另外,您有两个使用相同循环变量的嵌套循环。它可能无法按照您的意图工作。

我想正确删除我的向量的所有元素

由于您分配了内存的奇怪方式,因此无法释放所有内容。您会动态分配由temp指向的向量,然后在循环的下一个迭代中覆盖指针。就是这样,一旦指针的记录消失了,您就无法释放它。

我需要填充结构向量的向量

在这种情况下,您应该首先创建一个vector<vector<node>>。如果没有一个,则不能填充向量的向量,并且当前的代码没有一个。

如果您不保存指向新创建的向量的指针,则在此处创建:

temp = new std::vector<node>;

那么,没有办法删除并释放内存。

更改

std::vector<node *> vettProbX;
vettProbX.push_back(temp->data());

to

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()