0

現在、VS08 の問題に直面しています。次の(簡略化された)クラス構造を取得しました。

class CBase
{
    public:
    virtual void Func() = 0;
};

class CDerived : public CBase
{
public:
    void Func();
};

このコードはリリース モードでは正常に動作していますが、デバッグ ビルドを実行しようとすると、すぐにクラッシュしnew CDerivedます。

さらなる分析により、クラッシュの場所を突き止めることができました。CBase::CBase (コンパイラによって生成されたコンストラクター) でクラッシュしています。より正確には04AE46C6 mov dword ptr [eax],offset CBase::vftable' (505C2CCh) でクラッシュしています。

手がかりはありますか?リリース モードは問題ありませんが、適切にデバッグできません。

4

2 に答える 2

1

リリースモードは問題ありません

いいえ、問題ないようです。私の推測では、メモリが何らかの形で上書きされているデバッグ中です。投稿したコードだけでは判断できないため、できることを以下に示します。

私はあなたがどこかにオブジェクトを作成すると仮定します:

CBase* p = new CDerived;

または類似。デバッグ モードで、の場所にメモリ ブレークポイントを設定しpます。4 バイトを監視するように設定できます。Visual C++ (ほとんどのコンパイラと同様) は vfptr をクラスの最初のものとして保持するため、このブレークポイントはその場所が上書きされたかどうかを追跡します。クラッシュする関数を呼び出す前にブレークポイントにヒットした場合は、問題があります (コール スタックは、上書きされた理由を示します)。

多くの理由が考えられます-一部のメモリをオーバーランしてオブジェクトを上書きしている可能性があります(エリックが示唆したように)-リリースバージョンは動的ディスパッチのオーバーヘッドを防ぐために呼び出しを直接解決する可能性があり、クラッシュしない理由を説明します.

またdelete、オブジェクトを呼び出すと、デバッグ バージョンでは実際にメモリがゼロになりますが、リリース バージョンではそうではありません。それだけではなんとも言えません。

于 2013-02-13T21:22:50.657 に答える