如何删除向量的指针

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

【讨论】:

以上是关于如何删除向量的指针的主要内容,如果未能解决你的问题,请参考以下文章

如何从指向对象的指针向量中删除对象? [复制]

如何删除对象指针向量中的指针和对象本身?

如何使用类成员搜索对象指针向量?

如果已删除,如何从向量中删除对象

如何释放向量中的指针?

如何将唯一指针从一个向量移动到另一个唯一指针向量? [关闭]