2016-03-25 9 views
0

オブジェクトのメモリを特定のメモリ位置に配置するときは、配置new演算子が必要であることがわかります。例: なぜ新しいプレースメントを配置する必要がありますか?

 
int* MemoryBuffer = malloc(sizeof(int)*10); 
MyClass* Object = new (MemoryBufer) Myclass; 

は、我々は、単に上記のmallocによって割り当てられたメモリを指すようになります。この

MyClass* Object = reinterpret_cast<MyClass*>(MemoryBuffer);

オブジェクトのように行うことはできません。 プレースメントの新しい演算子が必要なのはなぜですか、同じことをするのか、それとも違いがありますか?

+3

あなたはユーザ定義型がコンストラクタを持つことができることを覚えていますか? – AnatolyS

+0

キャストは初期化されていないメモリを指しているだけなので、これは別の方法ではありません。それについて考え続けると、必然的にそれを使用することになります。 –

+0

ありがとう!私は新しい、コンストラクターが呼び出された後のポイントを逃した。 – Akshat

答えて

1

あなたが書いた場合:

auto MemoryBuffer1 = malloc(sizeof(Myclass)); 
    Myclass *pObject1 = new (MemoryBuffer1) Myclass; 

    auto MemoryBuffer2 = malloc(sizeof(Myclass)); 
    Myclass *pObject2 = reinterpret_cast<Myclass*>(MemoryBuffer2); 

その後*pObject1は、適切に構築オブジェクトであり、コンストラクタが呼ばれています。 *pObject2は、ランダムなバイトのコレクションへのポインタに過ぎず、有効なオブジェクトではありません。

0

最初のもの(配置new)はMyClassのコンストラクタを呼び出し、2番目のもの(再解釈キャスト)は呼び出されません。

関連する問題