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;
}