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

C++:如何在类析构函数中正确删除指针的指针数组

如何正确编写Second类的析构函数

好问题!这里的核心其实是对象所有权的问题——你的Second类到底要不要负责销毁那些通过add传进来的First对象?不同的情况,析构函数的写法完全不一样,我给你拆解清楚:

情况1:Second类拥有First对象的所有权

如果调用add方法时,传入的First*都是通过new动态分配的对象(比如add(new DerivedFromFirst());),并且这些对象的生命周期完全由Second类管理(之后不会有其他代码去delete它们),那你的析构函数需要做两件事:

  1. 遍历数组,销毁每个First对象(因为First是基类,必须确保它有虚析构函数,否则delete派生类指针会导致未定义行为);
  2. 销毁存储指针的数组本身。

对应的析构函数代码:

~Second() {
    // 先销毁每个First对象
    for (int i = 0; i < index; ++i) {
        delete arr[i]; // 依赖First的虚析构函数!
    }
    // 再销毁指针数组
    delete[] arr;
}

同时,必须给First类添加虚析构函数(你注释说它是虚类,这一步很关键):

class First {
public:
    virtual ~First() = default; // 虚析构是必须的
    // 其他纯虚或虚函数...
};

情况2:Second类不拥有First对象的所有权

如果传入的First*指向的是栈上的对象(比如First f; add(&f);),或者这些对象的生命周期由其他代码管理(比如另一个智能指针持有它们),那Second类只需要销毁自己分配的指针数组,绝对不能delete每个元素——否则会导致重复释放内存或者释放栈内存,直接触发程序崩溃。

对应的析构函数代码:

~Second() {
    // 只释放指针数组本身,不处理First对象
    delete[] arr;
}

怎么判断该用哪种情况?

简单来说:

  • 如果是Second类创建了这些First对象(或者明确接收了动态分配的对象并接管所有权),用情况1;
  • 如果只是借用外部对象的指针来使用,不负责销毁,用情况2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:39:37