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

使用std::unique_ptr指向基类时的析构函数调用与内存泄漏问题

问题解答

是的,这种情况确实会导致派生类对象的内存泄漏,核心问题出在基类的析构函数设计上。

为什么只会调用基类析构?

在C++多态场景中,当你用基类类型的智能指针(比如std::unique_ptr<Polygon>)指向派生类对象时,销毁对象的行为完全依赖基类析构函数是否为虚函数:

  • 如果基类析构函数不是虚函数,C++会触发静态绑定逻辑,直接调用基类的析构函数,完全跳过派生类的析构流程。
  • 这就意味着派生类对象中属于Square的专属成员(比如额外的成员变量、动态分配的内存)无法被正确销毁,对应的内存资源也就永久泄漏了。

不管是赋值操作替换第一个std::make_unique<Square>对象时,还是程序结束销毁剩余unique_ptr时,只要基类析构非虚,都会出现这个问题。

解决方法

给基类Polygon添加虚析构函数,这是C++多态场景下的标准操作:

class Polygon {
public:
    // 声明为虚析构,确保销毁时动态绑定到派生类析构函数
    virtual ~Polygon() = default;

    // 其他基类成员(比如纯虚函数等)
};

添加虚析构后,unique_ptr销毁对象时会先调用Square的析构函数,再调用Polygon的析构函数,完整释放整个对象的内存,彻底避免泄漏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 05:44:59