阅读:
接受的答案表明
new T[n]
的作用如下(忽略对齐和 n = 0 的情况):
n
= 1:
sizeof(T)
字节T
的ctor(如placement-new)n
> 1:
sizeof(size_t + n * sizeof(T))
字节n
T
字节序列中的每一个上调用 sizeof(T)
的向量(就像在循环中放置 new 一样)我可以信赖这个吗?也就是说,如果我按照上面的方式在自己的代码中模拟
new T[n]
,然后将结果传递给 delete[]
- 这会定义明确且安全吗?
我可以信赖这个吗?也就是说,如果我按照上面的方法在自己的代码中模拟 new T[n],然后将结果传递给 delete[] - 这会是定义明确且安全的吗?
不,这一切都未指定。您唯一可以确定的是
new T[n]
将调用 operator new[]
,其大小参数至少与 n*sizeof(T)
一样大。其他一切都是未指定的实现细节。
如果您愿意依赖特定的 ABI 保证,那么您可能会取得更大的成功,尽管技术上仍然是符合标准的 UB。例如,在 Itanium ABI 中,请参阅here,了解何时以及如何使用数组 cookie 的说明。该过程并不像您建议的那么简单。特别是,如果
T
没有重要的析构函数,并且通常的数组释放函数不接受两个参数,则不会有 cookie。此外,还应用了校正对齐的程序。