2016-07-04 10 views
0

今日私はポインタの奇妙な初期化を見た。作成時に変数へのポインタをキャスト

struct A 
{ 
    void* data; 
    int bufLen; 
    ... 
} 

void fun(A* a, int* result) 
{ 
    SomeClass* b = new (a->data) SomeClass(); 
} 

それは完全に罰金ですが、それはコンパイルん、それは作業を行いますが、私はなぜ知らない:それはこのようになります。 変数bの初期化で何が起こっているのか知りたいです。 これはキャストですか?新しいメモリスロットに変数a->dataのコピーがありますか?

+8

これは[placement 'new'](https://isocpp.org/wiki/faq/dtors#placement-new)と呼ばれています。 – Biffen

+1

「[新しいプレースメント]にはどのような用途がありますか?]」(http://stackoverflow.com/questions/222557/what-uses-are-there-for-placement-new) – user463035818

+0

ありがとうございました。 1つの質問:例えば、別のスレッドに情報を渡すために 'SomeClass'変数を使用できますか?できるなら、 'fun'関数でdescrutorを呼び出す必要がありますか? – Astinog

答えて

2

これはという新しい配置で、と呼ばれ、メモリ内の指定されたアドレスにオブジェクトを配置するために一般的に使用されます。

コードでは、タイプSomeClassのオブジェクトは、a->dataのメモリ位置に配置されます。

これを使用するには、operator newを自分でオーバーロードするか、ヘッダーファイル<new>に含まれている標準ライブラリで既に定義されているものを使用します。

関連する問題