以前初始化内存是否保证在放置新呼叫后仍然存在?

Luc*_*ore 7 c++ placement-new c++11

说我有以下内容:

struct A
{
   int x;
};

//...
A* aOriginal = new A();  //value construct aOriginal
assert( aOriginal->x == 0 );

A* aSecond = new (aOriginal) A;
assert( aSecond->x == 0 );
Run Code Online (Sandbox Code Playgroud)

第二个断言是否保证保持,即使aSecond没有进行值初始化?从逻辑上讲,它应该是,因为内存没有被覆盖,但它是否由标准指定?

R. *_*des 9

没有.

在同一存储位置构造第二个对象时,前一个对象的生命周期结束(§3.8/ 1):

[...]类型对象的生命周期T结束时:

  • 如果T是具有非平凡析构函数的类类型(第12.4节),则析构函数调用将启动,或者
  • 对象占用的存储器被重用或释放.

创建第二个对象时,由于A具有隐式默认构造函数,因此该x成员是默认初始化的,因此不执行初始化(第8.5/6节):

默认初始化的类型的对象T是指:

  • [...]

  • 否则,不执行初始化.

这意味着该对象具有不确定的值(§5.3.4/ 15):

新表达式创建类型的对象T如下初始化该对象:

  • 如果省略new-initializer,则默认初始化对象(第8.5节); 如果没有执行初始化,则该对象具有不确定的值.

如果您认为该值不是不确定的,因为您之前已初始化该存储位置上的另一个对象:该标准通过说明前一个对象的属性在其生命周期结束后不再适用而丢弃该可能性(§3.8/ 3) :

在本国际标准中归于对象的属性仅在其生命周期内适用于给定对象.

  • @DavidRodríguez-dribeas我认为"不确定的价值"很明显你不能依赖它. (2认同)
  • @VladLazarenko问题是*确切*是否由标准保证.我不明白你在那里想说什么. (2认同)