C++:如何在类析构函数中正确删除指针的指针数组
如何正确编写Second类的析构函数
好问题!这里的核心其实是对象所有权的问题——你的Second类到底要不要负责销毁那些通过add传进来的First对象?不同的情况,析构函数的写法完全不一样,我给你拆解清楚:
情况1:Second类拥有First对象的所有权
如果调用add方法时,传入的First*都是通过new动态分配的对象(比如add(new DerivedFromFirst());),并且这些对象的生命周期完全由Second类管理(之后不会有其他代码去delete它们),那你的析构函数需要做两件事:
- 遍历数组,销毁每个
First对象(因为First是基类,必须确保它有虚析构函数,否则delete派生类指针会导致未定义行为); - 销毁存储指针的数组本身。
对应的析构函数代码:
~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
相关产品推荐
相关产品推荐

