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

C++数组长度为0时的内存分配行为及代码输出疑问

关于new长度为0的对象数组的构造/析构函数调用问题

这问题问得很典型!咱们直接说结论:当你用new MyClass[0]分配长度为0的数组时,既不会触发MyClass的构造函数,也不会触发它的析构函数,下面给你详细拆解原因。

首先先把你的代码格式化完整,方便对照:

#include <iostream>
using namespace std;

class MyClass {
public:
    MyClass() { cout << "MyClass Object Created \n"; }
    ~MyClass() { cout << "MyClass Object Deleted\n"; }
};

int main(int argc, const char * argv[]) {
    int size = 0; // 数组长度为0
    std::cout << "Hello, World!\n";
    MyClass *mclass = new MyClass[size];
    // 即使加上delete[],也不会触发析构
    delete[] mclass;
    return 0;
}

核心原因:标准C++的明确规定

C++标准里对new[]操作符的行为有明确说明:当请求分配的数组长度为0时,编译器会返回一个合法的非空指针(注意:这个指针不能被解引用,因为没有实际的对象存在),但不会构造任何数组元素对象。

既然没有对象被创建出来,自然不会调用构造函数;同理,当你用delete[]释放这块内存时,因为没有需要销毁的对象,析构函数也不会被调用。

为啥要这么设计?

这种设计是为了让数组相关的代码逻辑更统一。比如你写一个遍历数组的循环:

for (int i = 0; i < size; ++i) {
    // 处理mclass[i]
}

当size=0时,这个循环直接不会执行,你不需要特意加一个if (size > 0)的判断分支,代码更简洁健壮。

所以你的代码运行后,只会输出Hello, World!,完全看不到构造和析构的打印信息,这是完全符合C++标准的正常行为。

内容的提问来源于stack exchange,提问作者S. Jaiswal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:55:50