【发布时间】:2012-07-30 21:07:38
【问题描述】:
假设我有以下内容:
struct A
{
int x;
};
//...
A* aOriginal = new A(); //value construct aOriginal
assert( aOriginal->x == 0 );
A* aSecond = new (aOriginal) A;
assert( aSecond->x == 0 );
即使aSecond 不是值初始化的,第二个断言是否保证保持?逻辑上是应该的,因为内存没有被覆盖,但是是标准规定的吗?
【问题讨论】:
-
你在同一个内存上创建了两次对象。
-
我敢说这是未定义的行为,因为第一个对象的生命周期还没有结束。但这可能可以通过调用 dtor 来解决。
-
@pmr:实际上行为并没有很好地定义,因为对象是一个 POD
-
问的时候我什至没有想到这一点,但我想我做到了,因为 POD 准确地表达了我的想法:)
-
@pmr: 3.8/1 类型 T 的对象的生命周期在以下情况下结束: — 如果 T 是具有非平凡析构函数(12.4)的类类型,则析构函数调用开始,或 — 对象占用的存储空间被重用或释放。 [作为对您在现已删除的答案中引用的请求的回答]
标签: c++ c++11 placement-new