ホームページ >バックエンド開発 >C++ >GNU GCC (g ) の複数のデストラクターはどのように異なり、なぜ生成されるのでしょうか?

GNU GCC (g ) の複数のデストラクターはどのように異なり、なぜ生成されるのでしょうか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-24 03:43:02188ブラウズ

How Do Multiple Destructors in GNU GCC (g  ) Differ and Why Are They Generated?

GNU GCC の複数のデストラクター (g )

質問:

コード カバレッジの調査中GNU GCC (g) では、BaseClass と DerivedClass の両方で複数のデストラクターが観察されました。これらの複数のデストラクタはなぜ生成されますか?また、それらはどのように異なりますか?

答え:

Itanium C ABI では、3 種類のデストラクタが定義されています:

  • D2 (基本オブジェクト デストラクター): オブジェクト自体、非仮想基本クラス、およびデータ メンバーを破棄します。
  • D1 (完全なオブジェクト デストラクター): 仮想基本クラスを含むオブジェクトを破棄します。
  • D0 (オブジェクト デストラクターの削除): オブジェクトを破棄し、演算子 delete を呼び出してメモリを解放します。

指定されたコード内の複数のデストラクター:

指定されたコードには仮想基本クラスが含まれているため、複数のデストラクターが生成されます。この場合:

  • DerivedClass::~DerivedClass() は D1 デストラクターであり、DerivedClass オブジェクトとその仮想基本クラス (BaseClass) を破棄します。
  • DerivedClass::~DerivedClass () は D2 デストラクターで、仮想基本クラスを除く DerivedClass オブジェクトのみを破棄します。
  • BaseClass::~BaseClass() は、DerivedClass 内の BaseClass サブオブジェクトの D1 デストラクターです。

デストラクターの選択的使用:

Itanium C ABI は、どのデストラクターが実行されるかを指定します:

  • 基本クラスへのポインターの削除 (例: delete b_ptr) は、D0 (デフォルト) または D1 (クラスに仮想デストラクターがある場合) を呼び出します。
  • 完全なオブジェクト ポインター (例: DerivedClass* dptr) へのポインターを削除すると、D1 を呼び出します。

カバレッジの影響:

100% の関数カバレッジを達成するには、これらのデストラクターを理解し、単体テストで適切に呼び出すことが重要です。たとえば、D0 を実行して両方のデストラクターをカバーするには、b_ptr を BaseClass* b_ptr として削除する必要があります。

以上がGNU GCC (g ) の複数のデストラクターはどのように異なり、なぜ生成されるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。