c++ - 删除函数C++中的对象

标签 c++

<分区>

我有一个简单的问题。

考虑下面的代码:

#include <iostream>

struct Node {
    int data;
    Node *left;
    Node *right;
    Node(int pData) : data(pData), left(nullptr), right(nullptr) {}
};

void delete_node(Node *node) {
    delete node;
    node = nullptr;
}

int main() {
    Node *node1 = new Node(1);
    Node *node2 = new Node(2);
    delete_node(node1);
    delete node2;
    node2 = nullptr;
    if (node1) std::cout << "node1: " << node1->data << std::endl;
    if (node2) std::cout << "node2: " << node2->data << std::endl;
    return 0;
}

产生输出:

node1: -572662307

我觉得这很奇怪,因为我在函数 delete_node 中设置了 node1 = nullptr。有人可以解释一下吗?

最佳答案

线

node = nullptr;

改变函数局部变量的值。它不会更改调用函数中 node1 的值。

更改函数以通过引用接受其参数。

// node is a reference to the pointer
void delete_node(Node*& node) {
    delete node;
    node = nullptr;
}

附言

您的程序有未定义的行为。 node1 的值不是main 中的nullptr 但它指向的对象已被删除。取消引用指针并访问其成员变量是未定义的行为。

关于c++ - 删除函数C++中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58066771/

相关文章:

c++ - 在 c/c++ 中分配指针

C++ 入门(第五版): Is "16.3 Overloading and Templates" wrong in all its "more specialized" examples?

c++ - GCC 标准库 XCode 4.5

c++ - 将项目 move 到列表而不复制

c++ - 在模板化类型的 CRTP 中定义类型

c++ - 为什么在模板化 lambda 时编译器生成的代码不同?

c++ - luaL_checkudata继承检查

c++ - 如何在 OpenCV + Visual C++ 中测量对比度

c++ - 在 Windows 上拦截和后处理所有音频流

c++ - 可以在模板参数中使用 decltype 吗?