能否依赖new[]的常规实现逻辑?自行模拟后用delete[]是否安全?
关于模拟
new T[n]后使用delete[]的合法性问题 有资料提到new T[n]的实现逻辑(忽略对齐和n=0的情况)如下:
- 当
n = 1或T是平凡可析构类型时:- 分配
sizeof(T)字节的内存 - 在分配的内存上调用
T的构造函数(类似placement-new)
- 分配
- 当
n > 1时:- 分配
sizeof(size_t) + n * sizeof(T)字节的内存 - 将前
size_t字节的值设为n - 在后续n段各
sizeof(T)字节的内存上分别调用T的构造函数(类似循环中的placement new)
- 分配
核心问题
能否依赖上述实现逻辑?即自行模拟new T[n]的行为后,将结果传递给delete[],这样做是否具有明确定义且安全?
结论
绝对不能依赖这种实现细节,这样的做法属于未定义行为。
C++标准仅规定new T[n]必须与delete[]配对使用,且delete[]只能释放由数组形式new分配的内存。标准并未强制new T[n]的具体内存布局或实现方式:
- 不同编译器、平台的数组
new可能采用完全不同的内存结构,比如部分实现不会在内存头部存储元素数量n,而是通过其他机制跟踪; - 对于平凡可析构类型,即使
n>1,编译器也可能省略头部计数,直接分配连续内存。
若你手动模拟内存布局并调用delete[],编译器无法正确识别你构造的非标准内存结构,可能引发析构函数调用错误、内存泄漏、程序崩溃等不可预料的问题。
内容的提问来源于stack exchange,提问作者einpoklum
相关产品推荐
相关产品推荐

