36

次のクラスでGoogleTestを使用してテストを作成していますが、上記のエラーが発生します。

class Base
{
    // Other Functions;

    CSig objSig[50];
}

クラスCSigは次のとおりです。

class CSig
{
    //... constructor, destructor(empty) and some functions
    CMod *objMod;
    CDemod *objDemod;
}

CSig :: CSig
{
    bIsInitialised = false;

    for (int i=0; i<MAX_NUM; i++)
    {
        PStrokePrev[i] = 0.0;
    }
}

ただし、破棄CSig objSig[50]すると、テストは正常に実行されます。

この問題を解決するにはどうすればよいですか?CSig objSig[50]また、 Baseクラスにいる必要があります。

4

8 に答える 8

36

SEH (Structured Exception Handling) 例外は、C++ 言語のコンストラクト (try-catch) を使用して処理できる C++ 例外ではありませんが、Windows 自体から発生し、根本的な欠陥を示しています。SEH 例外は、所有しているオブジェクトのデストラクタによって通常はクリアされるはずの閉じられていないファイルまたはロックされていないミューテックスにつながる可能性がある通常のスタックの巻き戻しを引き起こさないため、非常に煩わしいものです。現在のプロセスに属していないメモリにアクセスするときに SEH 例外が発生したため、CSig のコンストラクタとデストラクタでメモリ関連の命令を確認することをお勧めします。たとえば、SEH については、ここで読むことができます。

于 2012-10-31T12:32:31.543 に答える
9

Visual Studio 2010 で GoogleTest を使用すると、まさにこの問題に遭遇しました。セットアップには、GoogleTest フレームワーク用のライブラリを作成することが含まれ、それが個々の単体テストにリンクされます。最近、フレームワークのサポートを更新し、ゼロから再コンパイルしました。これを行った後、上記の例外が発生しました。

少し掘り下げた後、「Struct Member Alignment」設定が原因であることがわかりました。

プロジェクト プロパティ > 構成プロパティ > C/C++ > コード生成 > 構造体メンバーの配置

フレームワーク プロジェクトでは設定が「デフォルト」に設定されていましたが、対応する単体テスト プロジェクトでは「1 バイト /Zp1」に設定されていました。それらを同じ配置に変更すると、問題はなくなりました。

于 2015-02-26T22:54:25.643 に答える
3

私にとっては、null 参照エラーのように見えました。nullptr でいくつかのメソッドが呼び出されましたが、理由が不明なため、すぐに失敗するのではなく、実行を開始しました。SEH エラーは、未割り当てメモリにアクセスするとすぐに発生したと考えられます。だからヌルポインタをチェックしてください!

于 2016-02-08T13:35:25.383 に答える
1

Visual Studio 2013 を使用している場合は、[デバッグ] > [例外] の [Win32 例外 (具体的にはアクセス違反)] の [スロー] ボックスをオンにします。これにより、問題のある行をデバッグできます。プログラムが通常は他の例外を発生させる場合、デバッガーは壊れないので、これは便利かもしれません。

于 2016-10-19T15:38:13.803 に答える