17

C++ プログラムに次のコードがあるとします。

Object a = Object(someParameters);
new (&a) Object(someOtherParameters);

私の推測では、for の宣言の可能性を避けて、の内容aをに置き換えます。これは正しいです?Object(someOtherParameters)operator=Object

4

2 に答える 2

21

これは、プレースメント newと呼ばれます。新しいメモリを割り当てるのではなく、指定されたメモリでコンストラクターを呼び出します。この場合、割り当てられたメモリを解放する前に、オブジェクトのデストラクタを明示的に呼び出す必要があることに注意してください。

説明。生メモリを割り当てたとします。

char * rawMemory = new char [sizeof (Object)];

そして、そのメモリ上にオブジェクトを構築したいとします。あなたが呼ぶ

new(rawMemory) Object(params);

さて、メモリを解放する前に

delete [] rawMemory; 

Object のデスタクタを明示的に呼び出す必要があります

reinterpret_cast<Object*>(rawMemory)->~Object();

ただし、特定の例では、潜在的な問題は、メモリ内に新しいオブジェクトを構築する前に、既存のオブジェクトを適切に破棄していないことです。

おまけ:std::vector含まれているオブジェクトがデフォルトで構築可能である のに、標準がどのように機能するのか疑問に思ったことはありませんか? その理由は、すべてではないにしてもほとんどの実装では、 の場合に T がデフォルトで構築可能である必要がallocator<T>ある a を格納しないためです。代わりに、ポインタ (生メモリ) を格納し、. オブジェクトを作成すると、その char 配列の適切なアドレスに new を配置してコピー コンストラクターが呼び出されるだけです。T* pp = new T[N]charp = new char[N*sizeof(T)]push_back

于 2012-11-29T13:15:10.953 に答える
6

これは、プレースメント newとして知られています:Object括弧内に指定されたアドレスでnew を構築します。配置 new は通常、生メモリ内にオブジェクトを作成するために使用されます。このコードのように、既存のオブジェクトの上に新しいオブジェクトを構築することは、元のオブジェクトのデストラクタを呼び出さないため、悪い考えです。

于 2012-11-29T13:16:52.483 に答える