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(结构化异常处理)异常不是可以使用 c++ 语言构造(try-catch)处理的 C++ 异常,但它是从 Windows 本身引发的,并指向一些基本缺陷。SEH 异常非常烦人,因为它们不会导致正常的堆栈展开,这可能导致未关闭的文件或未解锁的互斥锁,这些互斥锁通常应该由拥有对象的析构函数清除。我在访问不属于当前进程的内存时遇到了 SEH 异常,因此我建议在 CSig 的构造函数和析构函数中查看与内存相关的指令。例如,您可以在此处阅读有关 SEH 的信息

于 2012-10-31T12:32:31.543 回答
15

我刚刚发现问题的方法是在 Visual Studio 中我转到 Debug->Exceptions,并检查了第一列中的所有内容。然后运行/调试你的单元测试,它会在问题所在的那一行抛出一个异常。那就是您需要调试/修复它的地方。

于 2015-03-17T13:33:57.560 回答
9

我在 Visual Studio 2010 中使用 GoogleTest 时遇到了这个问题。我们的设置涉及为 GoogleTest 框架创建一个库,然后将其链接到我们的各个单元测试。我最近更新了框架支持并从头开始重新编译它。这样做之后,我遇到了上面描述的异常。

经过一番挖掘,我发现“结构成员对齐”设置是罪魁祸首:

项目属性 > 配置属性 > C/C++ > 代码生成 > 结构成员对齐

虽然 Frameworks 项目的设置设置为“默认”,但相应的单元测试项目将其配置为“1 Byte /Zp1”。一旦我将它们更改为具有相同的对齐方式,问题就消失了。

于 2015-02-26T22:54:25.643 回答
3

对我来说,这似乎是一个空引用错误。在 nullptr 上调用了一些方法,由于我不清楚的原因,它并没有立即失败,而是开始执行。SEH 错误可能会在访问未分配的内存时立即发生。所以检查空指针!

于 2016-02-08T13:35:25.383 回答
1

破坏空指针可能是一个原因。我通过 Visual Studio > Exception > Select All 找到了。然后运行本地 Windows 调试器,它停在发生异常的行。

于 2020-12-30T01:28:33.203 回答
1

我有一个类似的问题,它与未初始化的变量和在发布版本中运行测试有关。我有一个 char * 未初始化,之后初始化为 NULL 似乎已经解决了这个问题。

于 2017-03-29T03:34:07.490 回答
1

如果您使用的是 Visual Studio 2013,请在“调试”>“异常”中选中“抛出的 Win32 异常(特别是访问冲突)”框。这将让您调试哪条线路有问题。这可能很有用,因为如果您的程序通常引发其他异常,调试器不会中断。

于 2016-10-19T15:38:13.803 回答
0

在 qt 中使用 msvc 遇到了这个问题。SEH 几乎是随机抛出的,没有明显的原因。(阅读:没有任何时间来研究它)在没有找到正确的解决方案并且测试似乎适用于非 Windows 用户之后,我切换到正常运行测试的 MinGW。

于 2019-12-13T08:27:38.623 回答