Stroustrup は、彼の新しい本TC++PL4 で、ユーザー制御のメモリ割り当てと配置、より具体的には、謎めいた「配置」に関して、かつては一般的だった慣行 に少し異なる光を当てています。本の宗派で。11.2.4、Stroustrup は次のように書いています。new
delete
「配置
delete
」演算子は、削除されたポインターが安全に派生されなくなったことをガベージコレクターに通知する可能性があることを除いて、何もしません。
これは、健全なプログラミングの実践が、配置への呼び出しdelete
によるデストラクタへの明示的な呼び出しに続くことを意味します。
けっこうだ。delete
ただし、あいまいなものよりも配置を呼び出すためのより良い構文はありませんか
::operator delete(p);
私が尋ねる理由は、ストラウストラップの宗派です。11.2.4 では、そのような奇妙な構文は言及されていません。実際、Stroustrup はこの問題について深く考えていません。彼は構文についてまったく言及していません。::operator
名前空間の解決の問題を、特に名前空間とはまったく関係のないものに割り込ませているの外観が、漠然と嫌いです。これ以上洗練された構文はありませんか?
参考までに、Stroustrup のより完全な文脈での引用を以下に示します。
デフォルトでは、オペレータ
new
はそのオブジェクトをフリー ストアに作成します。オブジェクトを別の場所に割り当てたい場合はどうすればよいでしょうか?...アロケータ関数に追加の引数を指定し、使用時にそのような追加の引数を指定することで、オブジェクトを任意の場所に配置できますnew
。void* operator new(size_t, void* p) { return p; } void buf = reinterpret_cast<void*>(0xF00F); X* p2 = new(buf) X;
この使用法により、
new(buf) X
追加の引数を に提供するための構文は、配置構文operator new()
として知られています。everyは最初の引数としてサイズを取り、割り当てられたオブジェクトのサイズは暗黙的に提供される ことに注意してください。演算子によって使用される は、通常の引数一致規則によって選択されます。everyの最初の引数は aです。operator new()
operator new()
new
operator new()
size_t
「配置」
operator new()
は、そのような最も単純なアロケーターです。これは、標準ヘッダーで定義されています<new>
。void* operator new (size_t, void* p) noexcept; void* operator new[](size_t, void* p) noexcept; void* operator delete (void* p, void*) noexcept; // if (p) make *p invalid void* operator delete[](void* p, void*) noexcept;
「配置
delete
」演算子は、削除されたポインターが安全に派生されなくなったことをガベージコレクターに通知する可能性があることを除いて、何もしません。
Stroustrup はその後new
、アリーナでの配置の使用について議論を続けています。delete
彼は再び配置について言及していないようです。