我正在使用GoogleTest为以下课程编写测试,我收到了上述错误。
class Base
{
// Other Functions;
CSig objSig[50];
}
Class 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]
时,测试运行正常。
我该怎么做才能解决这个问题?另外,我需要在Base类中使用CSig objSig[50]
。
答案 0 :(得分:24)
SEH(结构化异常处理)异常不是C ++ - 可以使用c ++语言结构(try-catch)处理的异常,但它是从windows本身引发的,并指向一些基本缺陷。 SEH-异常非常烦人,因为它们不会导致正常的堆栈展开,这会导致未关闭的文件或未解锁的互斥锁,这些互斥锁通常应由拥有对象的析构函数清除。 我在访问不属于当前进程的内存时遇到了SEH异常,所以我建议在CSig的构造函数和析构函数中查看与内存相关的指令。 您可以阅读有关SEH的信息,例如here
答案 1 :(得分:11)
我刚刚发现问题的方法是在Visual Studio中我去了Debug-&gt; Exceptions,并检查了第一列中的所有内容。然后运行/调试您的单元测试,它将在问题所在的行上引发异常。这就是你需要调试/修复它的地方。
答案 2 :(得分:5)
我在Visual Studio 2010中使用GoogleTest遇到了这个问题。我们的设置包括为GoogleTest框架创建一个库,然后将其与我们各自的单元测试相关联。我最近更新了Frameworks支持并从头开始重新编译它。执行此操作后,我遇到了上述异常。
经过一番挖掘后,我发现“结构成员对齐”设置是罪魁祸首:
项目属性&gt;配置属性&gt; C / C ++&gt;代码生成&gt;结构成员对齐
虽然Frameworks项目的设置设置为“default”,但相应的Unit Test项目已将其配置为“1 Byte / Zp1”。一旦我将它们更改为具有相同的对齐方式,问题就会消失。
答案 3 :(得分:3)
对我来说,它似乎是一个空引用错误。在nullptr上调用了一些方法,由于我不明白的原因,它没有立即失败但只是开始执行。一旦访问了未分配的内存,就可能发生SEH错误。所以检查空指针!
答案 4 :(得分:1)
我遇到了类似的问题,它与未初始化的变量有关,并在发布版本中运行测试。我有一个未初始化的char *,之后初始化为NULL似乎解决了这个问题。
答案 5 :(得分:1)
销毁空指针可能是一个原因。我是通过 Visual Studio > Exception > Select All 发现的。然后运行本地windows调试器,它停在发生异常的行。
答案 6 :(得分:0)
如果您使用的是Visual Studio 2013,请在Debug&gt; Exceptions中查看Win32异常(特别是访问冲突)的Thrown框。这将让您调试哪一行有问题。这可能很有用,因为如果程序通常引发其他异常,调试器不会中断。
答案 7 :(得分:0)
在qt中使用msvc遇到此问题。 SEH几乎是随机抛出的,没有明显原因。 (阅读:没有时间研究它了) 在找不到正确的解决方案并且测试似乎适用于非Windows用户之后,我切换到了MinGW,它可以正常运行测试。