如何删除矢量指针

时间:2014-02-06 14:46:29

标签: c++ pointers vector

我想正确删除矢量的所有元素。我需要以你在下面看到的方式填充结构向量的向量,每次创建一个新的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分配的新对象,但我不知道如何正确执行。

3 个答案:

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