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