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

C++中new创建5个对象数组为何调用5次构造仅触发1次析构

问题根因

析构函数调用次数和构造函数不匹配的核心原因是动态内存的申请/释放操作不配对,触发了C++标准定义的未定义行为:

  • 代码中使用new A[5]申请的是A类对象数组,属于数组维度的动态内存分配,按照语法要求必须使用数组专用的delete[]操作符释放
  • 现有代码使用普通delete a释放数组首地址指针时,运行时只会将指针指向的第一个A类对象判定为有效目标,仅调用这1个对象的析构函数,剩余4个数组成员的析构函数不会被触发,同时伴随内存泄漏问题
  • 未定义行为不存在固定表现:不同编译器、不同编译优化等级下,这类错误可能导致程序崩溃、内存泄漏、调用次数异常等任意结果,你观测到的"仅1次析构调用"就是这类异常表现的一种,不存在参考价值
正确写法

将普通delete替换为匹配数组申请的delete[]即可,修正后代码如下:

#include <iostream>
using namespace std;

class A {
public:
    A() { std::cout << "IM in C'tor" << std::endl; };
    ~A() { std::cout << "IM in De'tor" << std::endl; }
};


int main()
{
    A* a = new A[5];
    delete[] a;  // 与new[]配对的数组释放操作
    return 0;
}

编译运行修正后的代码,就可以观测到和5次构造调用一一对应的5次析构调用,符合预期。

规则提示:C++动态内存操作必须严格配对:new申请的单个对象用delete释放,new[]申请的对象数组必须用delete[]释放,二者混用的后果不可预测,写代码时需要严格规避。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:21:22