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

C++中使用delete释放多维数组的方式是否合法?

这种多维数组的分配释放方式是合法的吗?

嘿,这个问题挺有意思的!咱们一步步拆解,看看你的写法到底合不合规。

首先,你观察到的运行结果完全符合预期,而且从C++标准的角度来看,这种写法确实是合法的。

为什么new T是合法的?

你定义了typedef C T[5][5];,也就是T是固定大小的二维数组类型。当执行void *t = new T;时:

  • 编译器会分配足够容纳5×5个C对象的内存空间;
  • 自动调用所有25个C对象的构造函数,这就是你看到一系列+输出的原因。
    这完全符合C++标准对new表达式的规定——对于数组类型的对象,new会正确初始化其内部的所有元素。

为什么delete (T *) t是合法的?

这里是关键,很多人会混淆delete和delete[]的用法,但你的情况有点特殊:

  • 你用new T分配的是单个对象(这个对象本身是一个二维数组),而不是“数组的数组”;
  • 对应的释放操作就应该用delete,而不是delete[]。当执行delete (T *) t时,编译器会递归调用这个二维数组中所有C对象的析构函数(也就是25个~C()),然后释放内存,这就是你看到-输出的原因。

容易踩的坑

这里要区分两种写法的差异:

  • 如果是C (*p)[5] = new C[5][5];,这时候你分配的是“5个一维数组组成的数组”,返回的是指向第一个一维数组的指针,这种情况必须用delete[] p;来释放;
  • 而你的写法new T(T是C[5][5]),返回的是指向整个二维数组对象的指针,所以必须用delete来释放,用delete[]反而会导致未定义行为。

总结

你的代码完全符合C++标准,是一种合法的多维数组分配和释放方式,运行结果的正确性也验证了这一点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:56:06