You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除对象是否调用元素析构函数?单链表节点删除相关疑问

单链表节点与对象指针的析构、删除相关问题

先明确你的场景对应的典型节点结构(伪代码):

struct ListNode {
    ListNode* next;
    MyObject* data; // 存储指向对象的裸指针
};

下面逐个解答你的疑问:

  • 删除对象时会调用其析构函数吗?
    如果你是直接通过delete data;这种方式删除对象,那必然会调用MyObject的析构函数——这是C++中delete运算符的标准行为:先执行对象的析构逻辑,再释放其占用的堆内存。

  • 用delete删除链表节点,节点指向的对象是否会被删除?
    不会。delete链表节点的操作,只会销毁节点本身(如果ListNode有自定义析构函数会被调用),并释放节点的内存。但节点里的data只是一个普通裸指针成员,C++不会自动递归删除它指向的对象——除非你在ListNode的析构函数里手动添加delete data;的逻辑。

  • 是否会产生悬空指针?
    会出现两种相关风险:

    1. 原指向该链表节点的指针会变成悬空指针,因为节点内存已被释放;
    2. 节点里的data指向的对象仍留在堆内存中,如果没有其他指针持有它的引用,就会造成内存泄漏;如果后续还有其他指针指向这个对象,暂时没问题,但如果节点删除后没有保留data的引用,后续再想访问该对象就会找不到,也相当于间接引入了悬空指针的风险。
  • 该对象的析构函数会被调用吗?
    只有当你主动调用delete data;(或者使用智能指针自动管理内存)时,MyObject的析构函数才会被触发。单纯删除链表节点的话,对象本身并未被销毁,所以析构函数不会被调用。

额外建议

如果不想手动处理裸指针的内存管理,推荐用C++标准库的智能指针(比如std::unique_ptr<MyObject>)替代裸指针作为节点的data成员。这样当链表节点被delete时,智能指针会自动触发delete操作销毁指向的对象,既避免内存泄漏,也能减少悬空指针的风险。

内容的提问来源于stack exchange,提问作者GA Haroon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:32:28