C++プロジェクトで掘りながら、私はC++のnew
オペレータの奇妙な用法が発生しました:奇妙なC++のnew演算子の使用
int arr[5];
ClassA* a = new(arr) ClassA();
をあなたは私がこの構文を理解する助けてくださいますか?
C++プロジェクトで掘りながら、私はC++のnew
オペレータの奇妙な用法が発生しました:奇妙なC++のnew演算子の使用
int arr[5];
ClassA* a = new(arr) ClassA();
をあなたは私がこの構文を理解する助けてくださいますか?
これは配置の新しい構文です。メモリ内の指示された位置にオブジェクトを構築することができます。新しいの「通常」の使用を考えてみましょう:
X *p = new X;
...
delete p;
あなたが行うことで同じ効果を得ることができます。
#include <new>
...
void *buffer = ::operator new(sizeof(X));
X *p = new (buffer) X;
...
p->~X();
::operator delete(buffer);
を、後者は(それにX
を構築せずに)X
を保持するのに十分なメモリを割り当て、割り当てられたメモリにX
を明示的に構築します。その後、作成したX
を明示的に破棄し、それを含むメモリの割り当てを解除します。
も見るC++ FAQ:http://www.parashift.com/c++-faq/placement-new.html
new()
オペレータはsize
(バイト単位のサイズ)nothrow_value
(代わりbad_alloc
例外のヌルポインタを返す)またはpointer
が(すでに割り当てられたメモリ内にオブジェクトを構築取ることができますこのポインターによって指されている)引数であり、使用法では、arr
が指し示すメモリー位置に新しいオブジェクトを作成することを記述します。まともなガイドのために私はthis linkを見るでしょう。あなたはこの構文はplacement new
構文と呼ばれている。
中にClassAのその新しいインスタンスを作成するために、ARRのためにポインタを使用している引用場合は
。これは、通常、事前に割り当てられたバッファ上にオブジェクトを構築するために使用されます。これはメモリプールやガベージコレクタを構築するときや、単にパフォーマンスと例外の安全性が重要なときに便利です(メモリがすでに割り当てられているため割り当てが失敗する危険はなく、あらかじめ割り当てられたバッファにオブジェクトを作成する時間がかかりません) 。それが割当てを解除するために来るとき
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
はありません。メモリバッファを使用しているすべてのオブジェクトの割り当てを解除しないでください。代わりに、手動で各オブジェクトを破棄し、元のバッファのみを削除する必要があります。
私はあなたがそれぞれのオブジェクトを手動で破壊して元のバッファを削除することを意味していると思います。 –
@StuartGolodetzその愚かな間違いで申し訳ありません。訂正した – jester
google "placement new"またはこの質問をご覧ください:http://stackoverflow.com/questions/222557/what-uses-are-there-for -placement-new – Kos
@Askyane私は簡単な要約とあなたの熟読のためのリンクを添付しました – GMasucci