[英]c++ pointer issue involving delete operation
这是一个问题,我应该弄清楚错误是什么。
#include <cstdio>
struct Node {
int data;
Node* next;
};
void foo(Node* n) {
delete n->next;
}
Node* create(int x, Node* n) {
Node* n1 = new Node();
n1->data = x;
n1->next = n;
return n1;
}
int main(void) {
Node* n1 = create(1, NULL);
Node* n2 = create(2, n1);
foo(n2);
Node* n3 = create(3, NULL);
n1->data = 42;
printf("%d\n", n3->data);
delete n2;
delete n3;
return 0;
}
问题是,代码将打印数字42,而不是预期的值3。 我通过使用调试器将其范围缩小到以下问题:当行Node* n3 = create(3, NULL)
被调用时,在create方法内部,第一行创建的n1实际上是与之前的n1相同的地址。首先创建,然后删除。 这与创建n2时发生的情况相反,后者在create函数中的n1实际上有一个新地址。 因此出于某种原因,似乎在foo
的delete操作之后, new Node()
操作不再返回新地址。
仅供参考,当交换行foo(n2)
和Node* n3 = create(3, NULL)
,代码将打印3,这是预期的行为。
谢谢
调用foo(n2)
, n1
和n2->next
都指向同一个Node
对象。 foo
然后delete
该对象。 此时, n1
和n2->next
都指向无效位置。 这意味着,当您以后尝试分配给n1->data
时,程序的行为变得不确定。 在这种特殊情况下, n3
指向的对象最终会与n1
最初指向的对象位于同一位置,而您最终会通过n1
更改该对象。 虽然不能保证。 从无到有,程序崩溃都可能发生。
您的写入无效。 foo(n2)
有效地调用delete n1
,然后分配另一个Node
; 在您的情况下,新分配的内存具有与n1
相同的地址(自释放内存以来,该地址现在可用)。
如果您在valgrind
下运行程序,它将报告无效的写入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.