我有一个单链表,由指向下一个节点的指针和数据(指向对象的指针)组成。我的问题是:如果我使用
delete
从链表中删除一个节点,该节点指向的对象是否也会被删除,或者我最终会得到一个悬空指针?这种情况下会调用对象的析构函数吗?
一般来说,答案是否定的:当你
delete node
时,你的节点指向的数据不会被自动删除,因为C++中没有规则可以做到这一点。但是,如果您的 Node
类的析构函数调用 delete data
,那么数据将被删除。您可以执行以下操作来检查它:为数据对象类实现析构函数或在现有析构函数中放置断点,然后调试调用 delete node
的代码。如果您需要在删除节点时销毁数据,请确保 Node
析构函数调用 delete data
,如下所示:
#include <iostream>
class Data
{
public: ~Data()
{ // set a breakpoint on this line or check console output
std::cout << "data destructor is called...";
}
};
class Node
{
Data* data;
Node* next;
public:
Node() {}
Node(Data* _data):data(_data) {}
~Node()
{
// delete data when the node is deleted
delete data;
}
};
int main() {
std::cout << "create node...";
Node* node = new Node();
std::cout << "delete node...";
delete node;
std::cout << "deleted node." << std::endl;
std::cout << "create node with data...";
Node* nodeWithData = new Node(new Data());
std::cout << "delete node with data...";
delete nodeWithData;
std::cout << "deleted node with data.";
return 0;
}
示例代码只是为了说明删除节点和删除数据对象之间的关系。
编辑 2023 年 9 月 27 日: 根据 Viraltaco_ 在评论中的建议,在删除数据之前删除了 if(data) 。添加了用于创建然后删除节点的示例 main() 方法。当程序运行时,您应该得到以下输出:
create node...delete node...deleted node.
create node with data...delete node with data...data destructor is called...deleted node with data.