C++ 删除函数C+中的对象+;

C++ 删除函数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; } i

我有一个简单的问题

考虑以下代码:

#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;
}
因为我在函数
delete_node
中设置了
node1=nullptr
,所以我觉得这很奇怪。有人能解释一下吗?

这句话

node = nullptr;
更改函数局部变量的值。它不会改变调用函数中节点1的值

将函数更改为通过引用接受其参数

// node is a reference to the pointer
void delete_node(Node*& node) {
    delete node;
    node = nullptr;
}
附言
您的程序具有未定义的行为。
node1
的值不是
main
中的
nullptr
,而是它指向的对象已被删除。取消引用指针并访问其成员变量是未定义的行为。

好的,谢谢,我现在觉得很愚蠢:P@nathanesau,别难过。我们大多数人都经历过这样的错误:)将函数签名更改为
void delete\u node(node*&node)
我想添加一件事(副本没有说明):您不会因为
std::unique\u ptr
void destroy(std::unique\u ptr对象)
而遇到同样的麻烦。无法复制唯一指针,因此您必须移动它们:
std::Unique\u ptr p;销毁(std::move(p))将外部指针保持为空状态(甚至在函数调用之前)。附加优势:自文档化代码。函数签名已经表明函数将拥有对象的所有权。
// node is a reference to the pointer
void delete_node(Node*& node) {
    delete node;
    node = nullptr;
}