私はC++で書かれた他の人のコードを理解しようとしていますが、今まで見たことのないコンストラクタの奇妙な使い方があります。コードは次のようになります。new
とB(...)
間(a)
ありC++でのコンストラクタの奇妙な使用
A* a = new A(some initial values...);
...
B* b = new (a) B(some initial values...);
変数b
を初期化します。これは何を意味するのでしょうか?
私はC++で書かれた他の人のコードを理解しようとしていますが、今まで見たことのないコンストラクタの奇妙な使い方があります。コードは次のようになります。new
とB(...)
間(a)
ありC++でのコンストラクタの奇妙な使用
A* a = new A(some initial values...);
...
B* b = new (a) B(some initial values...);
変数b
を初期化します。これは何を意味するのでしょうか?
コードの行:
B* b = new (a) B(some initial values...);
は"placement new"を使用しています。
デフォルトの動作です。タイプB
の新しいオブジェクトをオブジェクトa
と同じメモリ位置に作成しています。新しいプレースメントに関連付けられたオーバーロードがある場合、ビヘイビアは過負荷でコード化され、デフォルトのタイプの動作も含まれます。
コードは、任意のオーバーロードで考慮する必要があるオブジェクトのメモリレイアウトとどのクラスA
とB
お互いに関連しています。
以前に作成されたオブジェクトの場所にオブジェクトを作成することは珍しいことです。私は、この2つのコードの間に、以前のオブジェクトa
を解体して(ただし、まだメモリを「割り当て済み」にしておく)コードがあると想像します。
isocpp FAQには、この手法の使用法とその危険性についてのアドバイスがあります。
「a」はどうなるの?彼らはどのように同じ場所を共有していますか? –
@ Selman22。他にどのようなコードがあるかによって異なります。率直に言えば、コードは匂いがすると思います。 – Niall
必ず同じ場所に作成しているわけではありません。例えば、 'return a-> allocate(sizeof(B))'を呼び出す)という全く新しい演算子new(size_t、A *)のオーバーロードがあります。 –
これは、という新しい配置という構文です。
これはわからないかもしれませんが、新しい機能はほとんどが標準のC++関数として動作するため、オーバーライドすることができ、追加のパラメータを受け入れることもあります。この場合、B
クラスの関数new
に渡される追加のパラメータ(引数)はa
です。
あなたは、たとえば、このについての詳細を読むことができますhere
a
で
B
を構築する意味(その場合、それもあなたのハードドライブをフォーマットすることができ)オーバーロードされた場合を除き
それ自身のための記憶。
これはデフォルトの配置new演算子ですが、オーバーロードされた' operator new(size_t、A *) 'を使用して、 'a'。 –
@JonathanWakely Dulyは編集してくれました。ありがとうございました。 –
Google「placement new」 – Bathsheba
一部のヘア分割:これはコンストラクタコードではありませんが、このコードはコンストラクタを呼び出しています。 – user463035818
しかし、他のいくつかのクラスインスタンス-Aで新しい配置を使用するのは奇妙に見えます。 – marcinj