new演算子 とはoperator new同じものではありません。
new演算子は関数を呼び出してメモリoperator newを割り当て、割り当てられた型と使用される構文に応じて、割り当てられたメモリのコンストラクターを初期化または呼び出します。つまり、オペレーターoperator newの操作の一部を形成するだけnewです。
operator newnewオペレーターがメモリーを割り当てるために呼び出される関数です。operator newwhich can be replaceのデフォルトの実装がありますが、これはオーバーロードと同じではありません。また、特定の型operator newに対して実装して、その型のオブジェクトのみの割り当てを処理することも、オーバーロードすることもできます。オーバーロードは、配置の新しい形式の演算子を使用して選択できます。operator newnew
のデフォルトの実装は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は呼び出されず、例外がスローされるとメモリ リークが発生します。