删除双指针

delete a double pointer

如何正确删除双指针数组?当我尝试这段代码时,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;
}

您已经在取消分配您已分配的内容,但 doublePtrNode[i]->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<Node>。这样你就不需要任何手动内存管理。它为你做。

#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

你需要先创建每个节点 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;
}