AUTOSAR C++14 Rule A12-4-2
If a public destructor of a class is non-virtual, then the class should be declared final
説明
ルール定義
If a public destructor of a class is non-virtual, then the class should be declared final.
根拠
C++ では、派生クラスのオブジェクトが破棄されると、最初にそのクラスのデストラクターが呼び出されてから、基底クラスのデストラクターが呼び出されます。クラス階層はポリモーフィックにもなります。基底クラス ポインターを宣言して、それに派生クラス オブジェクトを割り当てることができます。クラス階層に属しているオブジェクトを安全に破棄するには、public クラス デストラクターを virtual として宣言します。派生オブジェクトを指している 2 つの基底クラス ポインターが破棄される次のコードについて考えます。
class Base{
public:
	virtual	~Base();
	//..
};
class Derived : public Base{
public:
	~Derived();
	//..
};
class Base2{
public:
	~Base2();
	//..
};
class Derived2 : public Base2{
public:
	~Derived2();
	//...
};
int main(){
	
	Base* ptr = new Derived;
	Base2* ptr2 = new Derived2;
	delete ptr;
	delete ptr2;
}- ptrオブジェクトは、クラス- Derivedのオブジェクトを指しているクラス- Baseのポインターです。- ptrが削除されると、最初にその派生クラスのデストラクターが呼び出されてから、基底クラスのデストラクターが呼び出されます。- ptrが基底クラス オブジェクトであっても、正しいデストラクターが呼び出されて取得されたすべてのリソースが解放されます。これは、このクラス階層内の- publicデストラクターが- virtualとして宣言されているためです。
- ポインター - ptr2が削除されると、基底クラスのデストラクターのみが呼び出されます。これは、このクラス階層内の- publicデストラクターが非バーチャルであるためです。この種の不完全な破棄は未定義動作であり、メモリ リークや、コード実行の予期せぬ終了につながる可能性があります。
未定義動作を防止するために、public 非バーチャル デストラクターを含むクラスを基底クラスとして使用しないでください。このようなクラスを final として宣言し、これらのクラスが基底クラスではなく新しいクラスを派生できないことを指定してください。
Polyspace 実装
Polyspace® は、次の両方のステートメントが真の場合にクラス宣言にフラグを設定します。
- クラスの - publicデストラクターが- virtualとして宣言されていない。
- クラスが - finalとして宣言されていない。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: 特殊なメンバー関数 | 
| カテゴリ: Advisory、Automated | 
バージョン履歴
R2020b で導入