2016-01-28 10 views
5

私はC++で書かれた他の人のコードを理解しようとしていますが、今まで見たことのないコンストラクタの奇妙な使い方があります。コードは次のようになります。newB(...)(a)ありC++でのコンストラクタの奇妙な使用

A* a = new A(some initial values...); 
... 
B* b = new (a) B(some initial values...); 

変数bを初期化します。これは何を意味するのでしょうか?

+13

Google「placement new」 – Bathsheba

+1

一部のヘア分割:これはコンストラクタコードではありませんが、このコードはコンストラクタを呼び出しています。 – user463035818

+3

しかし、他のいくつかのクラスインスタンス-Aで新しい配置を使用するのは奇妙に見えます。 – marcinj

答えて

7

コードの行:

B* b = new (a) B(some initial values...); 

"placement new"を使用しています。

デフォルトの動作です。タイプBの新しいオブジェクトをオブジェクトaと同じメモリ位置に作成しています。新しいプレースメントに関連付けられたオーバーロードがある場合、ビヘイビアは過負荷でコード化され、デフォルトのタイプの動作も含まれます。

コードは、任意のオーバーロードで考慮する必要があるオブジェクトのメモリレイアウトとどのクラスABお互いに関連しています。

以前に作成されたオブジェクトの場所にオブジェクトを作成することは珍しいことです。私は、この2つのコードの間に、以前のオブジェクトaを解体して(ただし、まだメモリを「割り当て済み」にしておく)コードがあると想像します。

isocpp FAQには、この手法の使用法とその危険性についてのアドバイスがあります。

+1

「a」はどうなるの?彼らはどのように同じ場所を共有していますか? –

+2

@ Selman22。他にどのようなコードがあるかによって異なります。率直に言えば、コードは匂いがすると思います。 – Niall

+3

必ず同じ場所に作成しているわけではありません。例えば、 'return a-> allocate(sizeof(B))'を呼び出す)という全く新しい演算子new(size_t、A *)のオーバーロードがあります。 –

2

これは、という新しい配置という構文です。

これはわからないかもしれませんが、新しい機能はほとんどが標準のC++関数として動作するため、オーバーライドすることができ、追加のパラメータを受け入れることもあります。この場合、Bクラスの関数newに渡される追加のパラメータ(引数)はaです。

あなたは、たとえば、このについての詳細を読むことができますhere

0
、それは が新しい割り当てず、場所aBを構築する意味(その場合、それもあなたのハードドライブをフォーマットすることができ)オーバーロードされた場合を除き

new expression

それ自身のための記憶。

+1

これはデフォルトの配置new演算子ですが、オーバーロードされた' operator new(size_t、A *) 'を使用して、 'a'。 –

+0

@JonathanWakely Dulyは編集してくれました。ありがとうございました。 –