【发布时间】:2011-11-04 16:30:54
【问题描述】:
对于任何 POD 类型,是否建议这样做:
any_pod* p = new any_pod[n];
for (std::size_t i = 0; i < n; ++i)
new (&p[i].member) other_pod(whatever);
【问题讨论】:
-
你为什么不直接做
p[i].member = whatever;?保持简单,用一些没有优势的晦涩结构来迷惑每个人是没有意义的。 -
您正在重新构建一个已经构建的对象,这似乎是一个不好的习惯(即使对于 POD 可能无害)。
-
@FrEEzE2046:如果它包含一个具有非平凡构造函数的对象,那么它不是一个 POD!因此,您所拥有的是未定义的行为,因为
new构造了对象,然后您在同一内存位置再次构造。 -
代码是否正确取决于细节,但它绝对是一头丑陋、可怕的代码野兽。危险在于它完全掩盖了意图。如果您想要一个在某些私有内存中动态管理某些对象的类,您应该干净地设计它。这当然是可能的。如果您需要详细信息,请发布更多详细信息。
-
@KerrekSB:我不认为它依赖于对象,它是 UB,不管 UB 表现得有多糟糕。也就是说,如果
member有一个已经被调用的构造函数,那么在它之上的reconstructing 就是UB。这本身是否意味着系统将崩溃或只是重写内存中的某些值并且不会造成伤害,这都在 UB 所暗示的范围内
标签: c++ placement-new