4

これが私には面白そうなC++コードですが、動作することはわかっています。

構造体が定義されており、プログラムではvoidポインタを使用してメモリを割り当てます。次に、割り当てられたバッファを使用して構造体が作成されます。

ここにいくつかのコードがあります

typedef struct{
 char buffer[1024];
} MyStruct

int main()
{
   MyStruct* mystruct_ptr = 0;

   void* ptr = malloc(sizeof(MyStruct));

   // This is the line that I don't understand
   mystruct_ptr = new (ptr) MyStruct();

   free(ptr);

   return 0;
}

コードにはもっと多くのものがありますが、それがその要点です。

私はこのコードをテストしていませんが、私が見ているコードは非常によくテストされており、機能します。しかし、どのように?

ありがとう。

編集:そのメモリリークを修正しました。

4

7 に答える 7

11

これは、配置 newと呼ばれ、事前に割り当てられたバッファー (アドレスを指定します) にオブジェクトを構築します。

編集:より便利なリンク

于 2009-12-18T19:15:07.323 に答える
5

それが新しい配置です。必要なコンストラクターと初期化を実行しますが、メモリをnew割り当てるのではなく、メモリを提供しています。

詳細はすでにこのサイトで提供されています。

于 2009-12-18T19:15:35.967 に答える
2

これは新しい配置です。これは、実際にメモリを割り当てるのではなく、特定のアドレスを返すよう new に指示します。しかし重要なのは、まだコンストラクターを呼び出していることです。

この手法は、特定のメモリ アドレスにオブジェクトを作成する必要がある場合に必要です。

于 2009-12-18T19:15:21.473 に答える
2

Scott Meyers は、 Effective C++でこの手法を非常によく説明しています。

于 2009-12-18T19:21:03.037 に答える
1

その構成は新しい配置です。コンパイラは、メモリを割り当ててクラス コンストラクタを呼び出すのではなく、指定されたメモリ位置にインスタンスを構築します。メモリの割り当てと割り当て解除に対するこの種の制御は、長時間実行されるプログラムの最適化に非常に役立ちます。

于 2009-12-18T19:16:33.017 に答える
0

Google で「プレースメント 新規」を検索します。

于 2009-12-18T19:15:03.190 に答える
0

malloc の後、new の前にファイル read を配置すると、シリアル化されたバッファに事前に初期化された C++ オブジェクトを作成するための一般的な (しかし醜い) Load-In-Placeハックを実行することになります。

于 2009-12-18T23:37:54.287 に答える