3

vtable の破損の問題を引き起こしているルートで助けが必要です (それが起こっているかどうかはわかりません)。これは、コードの非常に単純化されたバージョンです。

class CBase
{
public:
    CBase()
    virtual ~CBase()
    virtual void base_virtual_fn1() = 0;
    virtual void base_virtual_fn2();
private:
    CData   _data;
};

class CDerived : public CBase
{
public:
    CDerived();
    virtual ~CDerived()
    virtual void base_virtual_fn1();
    virtual void base_virtual_fn2();
    virtual void derived_virtual_fn1();
    virtual void derived_virtual_fn2();
private:
    // Contains vectors , maps, integers, bools. 
};

CDerived のインスタンスを作成し、派生クラスの仮想関数 (derived_virtual_fn2 など) を呼び出すと、別の関数 (derived_virtual_fn1) が呼び出されます。

base_virtual_fnx の呼び出しに問題はありません。

これは、ヒープ上に作成されたオブジェクトでのみ発生し、ローカル オブジェクトでは発生しません。

これらのクラスは共有ライブラリにあります。Linux (SLES 10) で gcc 3.4.2 を使用しています。このコードのいずれにも pragma pack ディレクティブはなく、C と C++ コードが混在しています (extern c が使用されています)。ここで何が問題になる可能性がありますか?

他にもたくさんのコード(実行可能ファイル、ライブラリ)があることを忘れていました

4

5 に答える 5

1

ヒープ上に作成されたオブジェクトに対してのみ発生する場合、最も可能性の高い説明はヒープの破損です。これは、言及した 2 つのクラスとは関係がない可能性があります。割り当て/割り当て解除を確認してください! delete [] を正しく使用して配列などを削除していることを確認してください。おそらく、valgrind なども使用してください。

于 2010-12-21T01:54:49.727 に答える
0

あなたが私たちに見せてくれるほとんど何もないことに衝撃的なことは何もありません;-)

たまたまメモリ破損について何も理解していないときは、ユーティリティgflagsをオンにすることに慣れています。それは非常に賢明な小さなアプリケーションであり、非論理的な悪夢を引き起こす前に、多くの犯罪を検出します。しかし、それは物事を本当に遅くします。

gflags が叫ぶステップのほとんどを理解してみてください。

于 2010-12-23T17:46:06.740 に答える