2013-11-04 6 views
6

C++プロジェクトで掘りながら、私はC++のnewオペレータの奇妙な用法が発生しました:奇妙なC++のnew演算子の使用

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

をあなたは私がこの構文を理解する助けてくださいますか?

+5

google "placement new"またはこの質問をご覧ください:http://stackoverflow.com/questions/222557/what-uses-are-there-for -placement-new – Kos

+0

@Askyane私は簡単な要約とあなたの熟読のためのリンクを添付しました – GMasucci

答えて

2

これは配置の新しい構文です。メモリ内の指示された位置にオブジェクトを構築することができます。新しいの「通常」の使用を考えてみましょう:

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

2

new()オペレータはsize(バイト単位のサイズ)nothrow_value(代わりbad_alloc例外のヌルポインタを返す)またはpointerが(すでに割り当てられたメモリ内にオブジェクトを構築取ることができますこのポインターによって指されている)引数であり、使用法では、arrが指し示すメモリー位置に新しいオブジェクトを作成することを記述します。まともなガイドのために私はthis linkを見るでしょう。あなたはこの構文はplacement new構文と呼ばれている。

2

中に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はありません。メモリバッファを使用しているすべてのオブジェクトの割り当てを解除しないでください。代わりに、手動で各オブジェクトを破棄し、元のバッファのみを削除する必要があります。

+2

私はあなたがそれぞれのオブジェクトを手動で破壊して元のバッファを削除することを意味していると思います。 –

+1

@StuartGolodetzその愚かな間違いで申し訳ありません。訂正した – jester

関連する問題