(C++) 删除对象是否会调用其元素析构函数? [重复]

问题描述 投票:0回答:1

我有一个单链表,由指向下一个节点的指针和数据(指向对象的指针)组成。我的问题是:如果我使用

delete
从链表中删除一个节点,该节点指向的对象是否也会被删除,或者我最终会得到一个悬空指针?这种情况下会调用对象的析构函数吗?

c++ linked-list
1个回答
1
投票

一般来说,答案是否定的:当你

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.
© www.soinside.com 2019 - 2024. All rights reserved.