7

私は次のものを持っているとしましょう:

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値が初期化されていなくても、2 番目のアサートは保持されることが保証されていますか? 論理的には、メモリは上書きされないため、そうすべきですが、標準で指定されていますか?

4

1 に答える 1

9

いいえ。

同じストレージの場所に 2 番目のオブジェクトを構築すると、前のオブジェクトの有効期間が終了します (§3.8/1)。

[...] タイプのオブジェクトの存続期間は、次の場合にT終了します。

  • T自明でないデストラクタ (§12.4) を持つクラス型の場合、デストラクタの呼び出しが開始されます。
  • オブジェクトが占有するストレージは再利用または解放されます。

2 番目のオブジェクトが作成されるとA、暗黙のデフォルト コンストラクターがあるため、xメンバーはデフォルトで初期化されるため、初期化は実行されません (§8.5/6)。

タイプのオブジェクトをデフォルトで初期化Tするとは、次のことを意味します。

  • [...]

  • それ以外の場合、初期化は実行されません。

これは、オブジェクトの値が不定であることを意味します (§5.3.4/15):

type のオブジェクトを作成するnewTは、次のようにそのオブジェクトを初期化します。

  • new-initializerが省略された場合、オブジェクトはデフォルトで初期化されます(§8.5)。初期化が実行されない場合、オブジェクトの値は不定です。

また、以前にその保存場所で別のオブジェクトを初期化したために値が不確定ではないと思われる場合: 標準では、以前のオブジェクトのプロパティは、その有効期間が終了すると適用されなくなると言って、その可能性も破棄します (§3.8/3)。 :

この国際規格全体でオブジェクトに帰するプロパティは、そのオブジェクトの存続期間中のみ、特定のオブジェクトに適用されます。

于 2012-07-30T21:16:58.180 に答える