new
<ideTag id="new"></ideTag> カテゴリ
構文
void *operator new(std::size_t size) throw(std::bad_alloc); void *operator new(std::size_t size, const std::nothrow_t &) throw(); void *operator new[](std::size_t size) throw(std::bad_alloc); void *operator new[](std::size_t size, const std::nothrow_t &) throw(); void *operator new(std::size_t size, void *ptr) throw(); // Placement form void *operator new[](std::size_t size, void *ptr) throw(); // Placement form
説明
new 演算子は動的に記憶領域を割り当てます。標準ライブラリ関数 malloc とよく似ていますが、より優れています。 これらの割り当て関数は、size バイト分の記憶領域を割り当てようとします。 成功した場合、new は割り当てたメモリへのポインタを返します。 割り当てに失敗した場合、new 演算子は new_handler 関数を呼び出します。 new_handler のデフォルトの動作では、bad_alloc 型の例外を送出します。 例外を送出させたくない場合は、nothrow バージョンの operator new を使用します。 nothrow バージョンは、失敗すると例外を送出する代わりに、NULL ポインタを結果として返します。
operator new のデフォルトの配置形式は、予約済みであり、再定義できません。 ただし、別のシグネチャ(引数の数や型が異なるシグネチャ)を用いて配置形式をオーバーロードできます。 デフォルトの配置形式では、void 型のポインタを指定することができ、そのポインタが変更しないで返される以外は何のアクションも実行されません。 これは、既知のアドレスにオブジェクトを割り当てるときに役立つことがあります。 new の配置形式の使用には注意が必要です。必ずオブジェクトのデストラクタを明示的に呼び出してから、割り当て済みのメモリ バッファを解放する必要があるからです。 配置 new 演算子を用いて割り当てたオブジェクトに、delete 演算子を呼び出さないでください。
非配列割り当てを要求するには、適切な operator new() 関数を使用します。 配列割り当てを要求するときは常に、適切な operator new[]() 関数を呼び出します。 operator new[]() で作成した配列の割り当てを解放する場合は、必ず operator delete[]() の配列形式を使用してください。
メモ: クラスの配列では、デフォルトのコンストラクタをそのクラスで定義する必要があります。 0 バイトの割り当てを要求すると、NULL ではないポインタが返されます。 0 バイトの割り当てを繰り返して要求すると、それぞれ別の NULL ではないポインタが返されます。
nothrow バージョンの opertor new の例
#include <new> int main(int argc, char* argv[]) { int *pn; // nothrow version returns null pointer rather than throwing a // bad_alloc exception. pn = new(nothrow) int[5000000]; if(pn != NULL) { // Allocation succeded. } return 0; }