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
相关产品推荐
相关产品推荐

