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