私はあなたの答えの1つを読みました( 「空の」コンストラクターまたはデストラクタは、生成されたものと同じことをしますか?)。あなたは次のように書いています。コンパイラは、上記の場合と同様に、デストラクタの暗黙的な定義を提供します. そのデストラクタは、 auto_ptr オブジェクトのデストラクタも暗黙的に呼び出します. そして、それが保持している C オブジェクトを指すポインタを削除します - C の定義! これは、構造体 A のコンストラクターが定義されている .cpp ファイルに表示されます。2 つのことを説明してください。1. A のデストラクタが C の定義を知っている必要があるのはなぜですか? 2. A の空のデストラクタを追加すると、どのように状況が改善されますか? ありがとうございました
1 に答える
2
1) のデストラクタは、 to を含む可能性があるため、A
破棄する方法を知っている必要があります。'd オブジェクトは、それを含むオブジェクトが終了したときに終了すると予想されます。したがって、 のデストラクタは、を破棄する方法を知っている必要があります。C
A
auto_ptr
C
auto_ptr
A
C
2) 重要なのは、デストラクタの定義が .cpp ファイルにのみ記述されていることです。これは、デストラクタへの呼び出しが .cpp ファイルからコンパイルされたオブジェクトにリンクされることを意味します。.cpp ファイルがコンパイルされると、C の定義にアクセスできます (これが回答に書かれています)。したがって、.cpp ファイルのデストラクタは、デストラクタが定義されていないか、コンパイラが の前方宣言のみを認識した時点で定義されていた場合のように、C の破壊に失敗するのではなく、必要に応じて C を破壊できますclass C
。
また、参照してください
于 2013-07-28T19:12:25.937 に答える