2009-06-20 11 views
2

gccにコンパイルする抽象クラスには、COMオブジェクトにはないような仮想デストラクタは必要ないと伝える方法はありますか?たとえば、nsISupportsは欠落している仮想デストラクタについて常に不平を言います。私がこの警告を出したいと思うCOM以外のクラスを持っているかもしれないので、警告をオフにすることは役に立たないでしょう。COMのようなインタフェースは、非仮想デストラクタについて警告します

So __attribute __((com_interface))は廃止され、vtableレイアウトのみが変更されました。コンパイラに、このクラスの消失したデストラクタについて警告したくないということを伝えることができる別の__attribute__がありますか?

答えて

0

diagnostic pragmasのペアを使用します。それに失敗すると、#pragma GCC system_headerは、特定のファイル内のすべて警告を無効にします。

1

特に、大規模で複雑なコードベースでは、デバッグの悪夢であるため、仮想のdtor警告が欠落しています。
これは非常に具体的な理由がありますが、クラスがリファクタリングされ、後で使用量が変更された場合に発生しますか?

1

この警告を無効にすることを再検討してください。それは理由があります。あなたのクラスに仮想デストラクタを置くことは今日でも正しいかもしれませんが、あなたのクラスが将来どのように使用されるのかを正確に予測することはできません。

クラスの使い方が微妙に変わると、次の開発者がリソースリークを追跡しようとしている間に何時間も頭を抜いてしまう可能性があります。その人に好意を持ち、デストラクタを仮想にする。

また、あなたが自分で

をお願いし、私はあなたが抽象クラスを持つ言及して非仮想

することによって得ないので、私はそれが、少なくとも一つの仮想関数を持っていると仮定し何をしたいことがあり。したがって、デストラクタを仮想にすることは、オブジェクトにvテーブルを追加するのではなく、単にそれを拡張して別のメンバを含めるだけです。

私はこれを非仮想的にすることで本当の利得を見ることはできません。問題のみ。

+0

ありがとうございました。しかし、COMのように私はxpcom、windows comまたは類似のものを意味しました。ウィンドウのIUnknownには仮想デストラクタはありません。 mozillaのnsISupportsには仮想デストラクタはありません。これらのクラスとその派生クラスは、IUnknown/nsISupports :: release()関数で常に削除されます。 deleteでそれらを削除することは望ましくありません。だから、COMインタフェースに仮想デストラクタはないが、他のクラスにはその理由があるのだろうか? – gri

関連する問題