【问题标题】: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&lt;node&gt;; 这一行看起来像是内存泄漏的好地方。确保在 i 循环结束时删除 temp。

标签: c++ pointers vector


【解决方案1】:

您使用 new 分配的唯一对象是 std::vector&lt;node&gt; *temp;。 你用delete temp; 删除它,Vectors 自己的析构函数将处理其内容的破坏。但是每次调用 new 时都必须这样做。在这种情况下,您在循环内分配,因此您需要在循环结束时调用 delete。

但是因为temp只在作用域内使用,所以不需要动态分配。您可以像这样在堆栈上分配它:std::vector&lt;node&gt; temp;。然后它会在超出范围时自动销毁(在这种情况下是在函数结束时)。

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

要实现您想要做的事情,您需要做的是将所有临时指针存储在 std::vector&lt;std::vector&lt;node&gt;* &gt; 中,最后删除其中的每个向量。但是如果你根本不使用任何指针,你会得到更好的代码。

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

【讨论】:

  • 这只是我完整代码的主要内容。无论如何我需要动态分配它以用于其他目的。
  • @user2988113,还有什么用途?
  • 我需要在每次迭代时在 vettProbX 中存储一个指向不同内存段的指针。问题是如何正确删除所有用 new() 创建的指针。
  • @user2988113 正如这个答案所解释的,你只是用new 创建一个对象,这个答案还告诉你如何删除它。那么问题出在哪里?
  • @user2988113 在您的代码中,您分配 temp 10 次是的,但是您首先泄漏了 9 次,因为您没有将它们的指针存储在任何地方(因此不能再删除它们)。您总是会覆盖以前的temp 的指针。在代码的末尾,您尝试删除最后一个 temp 的内容(因为内容不是指针,所以不能删除)而不是向量本身。
【解决方案2】:

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

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

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

在这种情况下,您应该首先创建一个vector&lt;vector&lt;node&gt;&gt;。如果没有向量,则无法填充向量,而您当前的代码也没有。

【讨论】:

    【解决方案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()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2013-09-24
      • 2012-08-12
      • 2015-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多