繁体   English   中英

涉及删除操作的C ++指针问题

[英]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)n1n2->next都指向同一个Node对象。 foo然后delete该对象。 此时, n1n2->next都指向无效位置。 这意味着,当您以后尝试分配给n1->data时,程序的行为变得不确定。 在这种特殊情况下, n3指向的对象最终会与n1最初指向的对象位于同一位置,而您最终会通过n1更改该对象。 虽然不能保证。 从无到有,程序崩溃都可能发生。

您的写入无效。 foo(n2)有效地调用delete n1 ,然后分配另一个Node 在您的情况下,新分配的内存具有与n1相同的地址(自释放内存以来,该地址现在可用)。

如果您在valgrind下运行程序,它将报告无效的写入。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM