我可以依赖 new[] 通常的工作方式吗?

问题描述 投票:0回答:1

阅读:

标量 `new T` 与数组 `new T[1]`

接受的答案表明

new T[n]
的作用如下(忽略对齐和 n = 0 的情况):

  • 如果
    n
    = 1:
    • 分配
      sizeof(T)
      字节
    • 在分配的内存上调用
      T
      的ctor(如placement-new)
  • 如果
    n
    > 1:
    • 分配
      sizeof(size_t + n * sizeof(T))
      字节
    • 将前 size_t 个字节设置为
      n
    • 的值
    • 在接下来的 n 个
      T
      字节序列中的每一个上调用
      sizeof(T)
      的向量(就像在循环中放置 new 一样)

我可以信赖这个吗?也就是说,如果我按照上面的方式在自己的代码中模拟

new T[n]
,然后将结果传递给
delete[]
- 这会定义明确且安全吗?

相关问题:我可以动态生成可以使用delete[]删除的连续的非默认可修改对象序列吗?

c++ language-lawyer dynamic-memory-allocation new-operator placement-new
1个回答
0
投票

我可以信赖这个吗?也就是说,如果我按照上面的方法在自己的代码中模拟 new T[n],然后将结果传递给 delete[] - 这会是定义明确且安全的吗?

不,这一切都未指定。您唯一可以确定的是

new T[n]
将调用
operator new[]
,其大小参数至少与
n*sizeof(T)
一样大。其他一切都是未指定的实现细节。

如果您愿意依赖特定的 ABI 保证,那么您可能会取得更大的成功,尽管技术上仍然是符合标准的 UB。例如,在 Itanium ABI 中,请参阅here,了解何时以及如何使用数组 cookie 的说明。该过程并不像您建议的那么简单。特别是,如果

T
没有重要的析构函数,并且通常的数组释放函数不接受两个参数,则不会有 cookie。此外,还应用了校正对齐的程序。

© www.soinside.com 2019 - 2024. All rights reserved.