08項 new と deleteの別の意味を理解する
new と deleteの別の意味を理解する
new演算子とoperator new
new演算子は、要求された型のオブジェクトを保持するために十分なメモリを割り当て、コンストラクタを呼び出します。new演算子のこの動作を変えることはできません。
new演算子は十分なメモリを割り当てるために、operator newを呼び出します。operator newはオーバーロード可能です。
placement new
placement newは、すでに確保された領域にオブジェクトを展開します。
placement newは、下のように呼び出されます。
new (address) Class; // addressは確保されたメモリ領域の開始アドレス。 // Classのところに型名を指定
placement newも、operator newを呼び出した後、コンストラクタを実行します。
placement newのoperator newは、すでに確保されたメモリ領域を受け取るだけです。下のコードとみなせます。
void *operator new(size_t, void *location) { return location; }
削除とメモリーの解放
delete演算子は、new演算子と反対のことを行います。
new演算子は領域を確保してからコンストラクタを呼び出すのに対し、delete演算子はデストラクタを呼び出してから領域を解放します。
delete演算子が領域を解放するとき、operator deleteを呼び出します。operator deleteはオーバーロード可能です。
placement newで作成されたオブジェクトにdelete演算子を使ってはいけません。placement newのoperator newは確保されたメモリ領域を受け取るだけなので、その領域の解放はユーザーが行う必要があるからです。
placement newで作成されたオブジェクトを削除するときは、デストラクタを明示的に呼び出した後、適切な方法で領域を開放します。
配列
配列を割り当てるためにnew演算子を呼び出すには、下のように記述します。
string *ps = new string[10];
配列を割り当てるために使われたnew演算子は、領域確保のためにoperator new を呼び出した後、各要素のコンストラクタを呼び出します。
operator newと同じくoperator new も、オーバーロード可能です。
配列を削除するときのdelete演算子は、下のように記述します。
delete [] ps;
配列を削除するときのdelete演算子は、各要素のデストラクタを呼び出した後、operator delete で領域を解放します。
operator delete もオーバーロード可能です。