new
演算子 とはoperator new
同じものではありません。
new
演算子は関数を呼び出してメモリoperator new
を割り当て、割り当てられた型と使用される構文に応じて、割り当てられたメモリのコンストラクターを初期化または呼び出します。つまり、オペレーターoperator new
の操作の一部を形成するだけnew
です。
operator new
new
オペレーターがメモリーを割り当てるために呼び出される関数です。operator new
which can be replaceのデフォルトの実装がありますが、これはオーバーロードと同じではありません。また、特定の型operator new
に対して実装して、その型のオブジェクトのみの割り当てを処理することも、オーバーロードすることもできます。オーバーロードは、配置の新しい形式の演算子を使用して選択できます。operator new
new
のデフォルトの実装はoperator new
、次のシグネチャを使用して関数を定義することで置き換えることができます。
void *operator new(std::size_t size);
void *operator new(std::size_t size, const std::nothrow_t&);
void *operator new[](std::size_t size);
void *operator new[](std::size_t size, const std::nothrow_t&);
の置換またはオーバーロードをoperator new
提供する場合は、対応するoperator delete
関数を提供する必要があります。
void operator delete(void* ptr) noexcept;
void operator delete(void* ptr, const std::nothrow_t&) noexcept;
void operator delete[](void* ptr) noexcept;
void operator delete[](void* ptr, const std::nothrow_t&) noexcept;
operator new
演算子の配置形式で使用するために のオーバーロードを提供するにはnew
、追加の引数を追加できます ( の非スロー バージョンoperator new
とこれをoperator delete
行います)。
struct my_type {};
void *operator new(std::size_t size, const my_type&);
void operator delete(void *ptr, const my_type&);
new (my_type()) int(10); // allocate an int using the operator new that takes a my_type object
delete
オペレーターの「配置削除」形式はありません。のオーバーロードoperator delete
が提供されるのは、メモリの初期化/構築中にエラーが発生した場合 (たとえば、 が呼び出されたnew
後に演算子によって呼び出されたコンストラクターoperator new
)、対応するoperator delete
が存在する場合は、例外を再スローする前に呼び出されるためです。それ以外の場合operator delete
は呼び出されず、例外がスローされるとメモリ リークが発生します。