6

C++ プロジェクトを掘り下げているときに、C++ のnew演算子の奇妙な使い方に遭遇しました。

int arr[5];
ClassA* a = new(arr) ClassA();

この構文を理解するのを手伝ってくれませんか?

4

3 に答える 3

2

この構文は構文と呼ばれplacement newます。通常、事前に割り当てられたバッファーでオブジェクトを構築するために使用されます。これは、メモリ プールやガベージ コレクタを構築する場合、または単にパフォーマンスと例外の安全性が最も重要な場合に役立ちます (メモリは既に割り当てられているため、割り当て失敗の危険はなく、事前に割り当てられたバッファでオブジェクトを構築するのにかかる時間は短くなります)。 .

char *buf  = new char[sizeof(string)]; // pre-allocated buffer
string *s1 = new (buf) string("test1");    // placement new
string *s2 = new string("test2");   //ordinary new

割り当て解除に関してはplacement delete、自動的に魔法を行うものはありません。メモリ バッファーを使用しているすべてのオブジェクトの割り当てを解除しないでください。代わりに、各オブジェクトを手動で破棄してから、元のバッファのみを削除する必要があります

于 2013-11-04T11:09:43.233 に答える
2

これは配置の新しい構文です。これにより、メモリ内のポイントされた場所にオブジェクトを構築できます。new の「通常の」使用法を考えてみましょう:

X *p = new X;
...
delete p;

次のようにして、同じ効果を得ることができます。

#include <new>

...

void *buffer = ::operator new(sizeof(X));
X *p = new (buffer) X;
...
p->~X();
::operator delete(buffer);

後者は、 an を保持するのに十分なメモリをX(その中に an を構築せずXに) 割り当ててから、割り当てられたメモリに an を明示的に構築しXます。その後、作成した を明示的に破棄し、Xそれを含んでいたメモリの割り当てを解除します。

C++ FAQ も参照してください: http://www.parashift.com/c++-faq/placement-new.html

于 2013-11-04T11:05:54.243 に答える
2

new()演算子はsize(バイト単位のサイズ)(例外nothrow_valueの代わりにnullポインターを返す)または(このポインターが指す既に割り当てられたメモリにオブジェクトを構築する)引数を取ることができ、説明する使用法では新しいオブジェクトを作成していますが指すメモリ位置。それに関する適切なガイドについては、このリンクを参照してください。bad_allocpointerarr

あなたが引用したケースでは、 arr のポインターを使用して ClassA の新しいインスタンスを作成しています。

于 2013-11-04T11:08:26.910 に答える