2011-12-23 2 views
0

最近、私はベースクラスのクラスサイズの変更とコンパイルされていない派生クラスのためにクラッシュすることはほとんどありませんでした。簡単な例を挙げましょう。BaseClassというBaseClassがBase.dllにあり、そのクラスを継承し、Derived.dllに存在するDerivedClassを作成しました。 BaseClassのサイズが変わるたびにDerived.dllを再コンパイルする必要があります。しかし、すべての依存バイナリを見つけることが常に可能であるとは限らず、時には人々がいくつかの依存バイナリを欠いていることもあります。そのような場合は、デバッグが非常に難しい不思議なクラッシュが発生します。そのような問題を絞り込む方法はありますか?言い換えれば、あなたはこの方向にどのような手がかりを考えさせるでしょうか?ベースクラスのサイズ変更によるクラッシュのデバッグ

EDIT 1:詳細。 base1、base2、base3などと呼ばれる複数の基本クラスがあり、それぞれ別々のdllで派生しているとします。 derived1.dll、derived2.dll、およびderived3.dllがあります。 1つの基本クラスでサイズ変更のために他のすべてのプロジェクトをコンパイルする必要はありません。また、依存関係の作成はオプションではないため、この問題が頻繁に発生します。

+1

'BaseClass'の定義を変更すると、' DerivedClass'とその扶養者の再コンパイルがトリガーされます。なぜこれは起こっていないのですか? –

答えて

0

再コンパイル以外の偽の証明オプションはありません。あなたのclass BaseClassから派生したクラスを見つけることが問題であれば、それは次のように解決できます。

class FinalLock { 
    FinalLock() {} 
    friend class BaseClass; 
}; 

あなたがBaseClassサイズを変更するたびに、次の操作を行います

class BaseClass : virtual FinalLock { 
    ... 
}; 

そして、プロジェクト全体を再コンパイルします。どちらのクラスがBaseClassから派生しても、コンパイラエラーが発生します(実際には、クラスのインスタンス化によってエラーが発生します)。

これは、どのクラスがBaseClassに依存するかを示します。この練習は1回だけ必要です。その後、すべての依存コードにマークを付けることができます。

完了したらこの余分なコードを削除してください。 C++ 11では、上記の技術はまだ容易に行うことができる。一つは、すべての依存モジュールが適切に再コンパイルされるように、依存関係を修正するだろう

final class BaseClass { 
^^^^^ 
}; 
0

方法。これは共有ライブラリ全体の面倒なことかもしれませんが、直接修正することはできません。

方法2は、常に「すべてを再構築する」ことです。または、常にobjディレクトリ内のすべてを削除してビルドします。

メソッド3には、オブジェクトのサイズをチェックし、そこのオブジェクトのサイズを返すAPI境界をまたぐ新しい呼び出しと比較するデバッグモードコードを追加します。

関連する問題