サブオブジェクト (非静的データ メンバーを含む) は、それらが属する完全なオブジェクトと同じ保存期間を持ちます。これは、それらが自動的であると言っているのと同じではありません。自動オブジェクトは、ブロックの最後で破棄されます。サブオブジェクトは、完全なオブジェクトが破棄されるたびに破棄されます。たとえば、完全なオブジェクトが で作成され、new
で破棄されるdelete
(つまり、動的な保存期間がある) 場合、サブオブジェクトも の呼び出しで作成され、 の呼び出しnew
で破棄されdelete
ます。一方、自動オブジェクトのサブオブジェクトも自動です。
のコンストラクターがX::bb
例外をスローする場合は、型の完全なオブジェクトをX
構築できないことを意味します。X::aa
完全なオブジェクトと同じ保存期間を持つサブオブジェクトは、完全なオブジェクトなしでは存続できないため、 などの既に構築されているすべてのサブオブジェクトを破棄する必要があります。
一方、X
オブジェクト全体の構築が正常に完了した場合X::aa
、完全なオブジェクトが破棄されるまで (直後に) 他のサブオブジェクトは破棄されませんX
。
C++ の構築規則と破棄規則は、プログラムが正常に終了する限り、作成されたすべてのオブジェクトも 1 回だけ破棄されることを保証することを目的としています。これは、RAII イディオムにとって不可欠です。この例でX::aa
は、構築時にリソースを取得する場合、言語はそれらのリソースが解放されることを保証する必要があります。の構築が失敗しX::aa
たときに のデストラクタが呼び出されない場合、いつ呼び出す必要がありますか?X