new演算子関数
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/02/02 08:52 UTC 版)
new演算子とnew[]演算子での記憶域の確保を制御するために、これらの演算子は多重定義が可能である。そうして定義されたnewおよびnew[]演算子関数は、newおよびnew[]演算子での記憶域確保に使用される。そして、deleteおよびdelete[]演算子の記憶域の解放には、deleteおよびdelete[]演算子関数が使用される。 クラス内に設置した場合、そのクラスと派生クラスをnew演算子で作成する際の記憶域の確保に使用される。なおクラス内に置いた場合、staticを指定しなくても、自動的に静的メンバ関数として扱われる (X3014 12.5)。 class hoge{public: static void* operator new(std::size_t); static void* operator new[](std::size_t); static void operator delete(void*); static void operator delete[](void*);}; new hogeという式は次のように実行される。 まず、new演算子関数の名前探索を行う(この例では、hoge::operator newが見つかる)。 sizeof (hoge) の値を引数にしてnew演算子関数を呼び、記憶域確保を行う。 new演算子関数が返したポインタの指す位置をthisポインタとして、コンストラクタを呼び、インスタンスを生成する。 new[]演算子関数がnew演算子関数と分かれている理由は、『C++の設計と進化』によれば、型Tの配列はTのオブジェクトではないという方針により、Tの配列を確保するためにTのnew演算子関数を使うわけには行かないと考えられたためである。そこで別途new[]演算子関数を設けることにしたのである (§10.3)。 なお、new T[n]としたとき、new[]演算子関数にはsizeof (T) * nよりも大きい値が引数に渡される可能性がある。これは、主にdelete[]で解放するときにデストラクタを呼ぶ回数(配列の要素数)を記録するためなどといった理由によるものである。 また、newとnew[]演算子関数は、クラスの外、名前空間内にも定義でき、new及びnew[]演算子関数が定義されていないクラスとその他の型では、名前探索を行って記憶域の確保に用いるnewないしnew[]演算子関数を決定する。このため、大域名前空間にはデフォルトのnewとnew[]演算子関数が定義されており、標準C++ライブラリの中で唯一の大域名前空間で定義された関数となっており、ヘッダ
※この「new演算子関数」の解説は、「New演算子」の解説の一部です。
「new演算子関数」を含む「New演算子」の記事については、「New演算子」の概要を参照ください。
- new演算子関数のページへのリンク