このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
不完全なクラス ポインターの変換または削除
不完全なクラスを指すポインターの削除またはキャスト
説明
この欠陥は、不完全なクラスへのポインターを削除またはそのポインターにキャストした場合に発生します。不完全なクラスとは、そのクラスが使用される時点でその定義が可視になっていないポインターのことです。
たとえば、クラス Body
の定義は、delete
演算子が Body
のポインターに対して呼び出されたときには可視ではありません。
class Handle { class Body *impl; public: ~Handle() { delete impl; } // ... };
リスク
不完全なクラスを指すポインターを削除すると、そのクラスに含まれている可能性のある非トリビアル デストラクターを呼び出せなくなります。デストラクターでメモリ割り当て解除などのクリーンアップ アクティビティを実行している場合、これらのアクティビティが発生しません。
同様の問題は、たとえば、不完全なクラスを指すポインターにダウンキャストする場合に発生します (ダウンキャストとは、基底クラスを指すポインターから派生クラスを指すポインターにキャストすることです)。ダウンキャストの時点では、基底クラスと派生クラスの関係は不明です。特に、派生クラスが複数のクラスから継承している場合、ダウンキャストの時点ではこの情報を利用できません。ダウンキャストでは多重継承に必要な調整を加えることができず、その結果のポインターはデリファレンスできません。
アップキャスト (派生クラスを指すポインターから基底クラスを指すポインターにキャストすること) についても同様の説明ができます。
修正方法
クラスを指すポインターを削除したり、そのようなポインターにダウンキャストしたりする場合、クラス定義が可視であることを確認します。
あるいは、次のいずれかの操作を実行できます。
通常のポインターではなく、
std::shared_ptr
型を使用して不完全なクラスを指す。ダウンキャストするときに、その結果が有効であることを確認する。無効な結果についてはエラー処理コードを作成する。
例
結果情報
グループ: オブジェクト指向 |
言語: C++ |
既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: INCOMPLETE_CLASS_PTR |
影響度: Medium |
バージョン履歴
R2018b で導入