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

