【问题标题】:delete a double pointer删除双指针
【发布时间】:2021-12-29 13:01:51
【问题描述】:

如何正确删除双指针数组?当我尝试这段代码时,memcheck 告诉我“使用大小为 8 的未初始化值”和“大小为 4 的无效写入”。我不知道我哪里做错了。

struct Node
{
    int value;
    Node* next;
};


int main()
{

    Node** doublePtrNode= new Node* [10];
     
     for (unsigned int i = 0; i < 10; i++)
    {
        
        doublePtrNode[i]->value=i;
        
    }

    for (unsigned int i = 0; i < 10; i++)
    {
        delete doublePtrNode[i];
    }
  
    delete[] doublePtrNode;

    return 0;
}

【问题讨论】:

  • 您的问题是分配第二维而不是删除。这个问题应该有帮助:https://stackoverflow.com/questions/936687/how-do-i-declare-a-2d-array-in-c-using-new
  • 你永远不会为数组doublePtrNode(它们是指针)的元素赋值。
  • 旁注:明确使用newdelete,因为C++11 被认为是一种不好的做法。您应该使用std::vector,它将代表您进行适当的内存管理。在其他情况下,有std::unique_ptrstd::shared_ptr

标签: c++ pointers memory


【解决方案1】:

您已经在释放分配的内容,但 doublePtrNode[i]-&gt;value=i; 假定您已在其中分配了 Node,但您还没有,因此程序具有未定义的行为

如果你打算使用原始的拥有指针,你可以这样修复它:

Node** doublePtrNode = new Node*[10];
// now allocate the actual `Node`s too:
for(unsigned i = 0; i < 10; ++i) doublePtrNode[i] = new Node;

// your current assigning loop goes here

// deallocate the `Node`s:
for(unsigned i = 0; i < 10; ++i) delete doublePtrNode[i];
delete[] doublePtrNode;

一个更简单、更安全的选择是使用std::vector&lt;Node&gt;。这样您就不需要任何手动内存管理。它为你做。

#include <vector>

int main() {
    std::vector<Node> nodes(10);

    // your current assigning loop goes here

} // all `Node`s are deleted when `nodes` goes out of scope

【讨论】:

  • 谢谢你,泰德,你的解释。所以当我创建双指针数组时,我只创建了 10 个 Node 指针,因为它们只是指针。我仍然需要为每个节点分配内存以便它们可以使用对吗?
  • @Steven 没错!完美的总结。
【解决方案2】:

你需要先创建每个节点 doublePtrNode[i] 然后再为其赋值

struct Node
{
    int value;
    Node* next;
};


int main()
{

    Node** doublePtrNode = new Node * [10];

    for (int i = 0; i < 10; i++)
    {

        doublePtrNode[i] = new Node{ i,nullptr };

    }

    for (unsigned int i = 0; i < 10; i++)
    {
        delete doublePtrNode[i];
    }

    delete[] doublePtrNode;

    return 0;
}

【讨论】:

  • 谢谢@arutar,我现在对指针有了更好的理解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-09
  • 2010-09-08
  • 2018-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多