Home > Net >  delete a double pointer
delete a double pointer

Time:11-19

How to properly delete a double-pointer array? when I tried this code, memcheck told me that "Use of the uninitialized value of size 8" and "Invalid write of size 4". I couldn't figure out where I did wrong.

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;
}

CodePudding user response:

You are already deallocating what you have allocated but doublePtrNode[i]->value=i; assumes that you've allocated a Node there, but you haven't so the program has undefined behavior.

If you are going to use raw owning pointers, you could fix it like this:

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;

A much simpler and safer option is to use a std::vector<Node>. That way you do not need any manual memory management. It does it for you.

#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

CodePudding user response:

you need create every node doublePtrNode[i] before assign on it value

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;
}
  • Related