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]
基本クラス。
SEH(Structured Exception Handling)例外は、c ++言語構造(try-catch)を使用して処理できるC++例外ではありませんが、Windows自体から発生し、いくつかの基本的な欠陥を指します。 SEHの例外は、通常のスタックの巻き戻しを引き起こさず、閉じられていないファイルや、所有オブジェクトのデストラクタによって通常クリアされるロック解除されていないミューテックスを引き起こさないため、非常に迷惑です。現在のプロセスに属していないメモリにアクセスするときにSEH例外が発生したため、CSigのコンストラクタおよびデストラクタでメモリ関連の命令を確認することをお勧めします。たとえば、SEHについて読むことができます here
問題を見つけたのは、Visual Studioで[デバッグ]-> [例外]に移動し、最初の列のすべてをチェックすることでした。次に、単体テストを実行/デバッグすると、問題のある行に例外がスローされます。そこでデバッグ/修正する必要があります。
Visual Studio 2010でGoogleTestを使用すると、この問題に出くわしました。セットアップには、GoogleTest Frameworksのライブラリの作成が含まれ、その後、個々の単体テストにリンクされます。最近、フレームワークのサポートを更新し、ゼロから再コンパイルしました。これを実行した後、上記の例外が発生しました。
少し掘り下げた後、「Struct Member Alignment」設定が原因であることがわかりました。
プロジェクトプロパティ>構成プロパティ> C/C++>コード生成>構造体メンバーの配置
Frameworksプロジェクトの設定は「default」に設定されていましたが、対応する単体テストプロジェクトでは「1 Byte/Zp1」に設定されていました。同じ配置になるように変更すると、問題はなくなりました。
私にとっては、null参照エラーのように見えました。 nullptrでいくつかのメソッドが呼び出されましたが、理由はわかりませんが、すぐには失敗せず、実行が開始されました。割り当てられていないメモリにアクセスするとすぐに、SEHエラーが発生したと考えられます。したがって、nullポインターを確認してください!
同様の問題があり、初期化されていない変数に関するものであり、リリースビルドでテストを実行しています。 NULLに初期化された後、char *が初期化されていないため、問題が修正されたようです。
Visual Studio 2013を使用している場合は、[デバッグ]> [例外]でWin32例外(具体的にはアクセス違反)の[スロー]ボックスをオンにします。これにより、どの行に問題があるかをデバッグできます。これは、プログラムが通常他の例外を発生させた場合にデバッガーが壊れないため便利です。