我正在使用 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(结构化异常处理)异常不是可以使用 C++ 语言结构(try-catch)处理的 C++ 异常,但它是从 Windows 本身引发的,并指出一些基本缺陷。 SEH 异常非常烦人,因为它们不会导致正常的堆栈展开,这可能会导致未关闭的文件或未解锁的互斥体,而这些互斥体通常应由所属对象的析构函数清除。 我在访问不属于当前进程的内存时遇到了 SEH 异常,因此我建议在 CSig 的构造函数和析构函数中查看与内存相关的指令。 例如,您可以阅读有关 SEH 的内容,此处
我刚刚发现问题的方法是在 Visual Studio 中转到“调试”->“异常”,并检查第一列中的所有内容。然后运行/调试您的单元测试,它会在问题所在的行上抛出异常。这就是您需要调试/修复它的地方。
我在 Visual Studio 2010 中使用 GoogleTest 时遇到了这个问题。我们的设置涉及为 GoogleTest 框架创建一个库,然后将其链接到我们单独的单元测试。我最近更新了框架支持并从头开始重新编译。这样做之后,我遇到了上面描述的异常。
经过一番挖掘,我发现“结构成员对齐”设置是罪魁祸首:
项目属性 > 配置属性 > C/C++ > 代码生成 > 结构成员对齐
虽然框架项目将设置设置为“默认”,但相应的单元测试项目将其配置为“1 字节/Zp1”。一旦我将它们更改为具有相同的对齐方式,问题就消失了。
对我来说,这似乎是一个空引用错误。在 nullptr 上调用了某些方法,由于我不清楚的原因,它并没有立即失败,而是刚刚开始执行。据推测,一旦访问未分配的内存,就会发生 SEH 错误。所以检查空指针!
我遇到了类似的问题,它与未初始化的变量和在发布版本中运行测试有关。我有一个 char * 未初始化,之后初始化为 NULL 似乎已经解决了问题。
如果您使用的是 Visual Studio 2013,请在调试 > 异常中选中 Win32 异常(特别是访问冲突)的抛出框。这将让您调试哪一行有问题。这可能很有用,因为如果您的程序正常引发其他异常,调试器不会中断。
销毁空指针可能是一个原因。我是通过 Visual Studio > 异常 > 全选发现的。然后运行本地Windows调试器,它停在发生异常的行。
在qt中使用msvc遇到这个问题。 SEH 几乎是随机抛出的,没有“明显”的原因。 (阅读:没有时间去研究它了) 在找不到正确的解决方案并且测试似乎适用于非 Windows 用户之后,我切换到 MinGW,它可以正常运行测试。
要使用 protobuf,我遵循了
此处的说明,特别是针对 Windows 的 vcpkg 安装。 事实证明,Gtest 项目从父级继承了链接器中的库,最终链接到 libprotobuf 和 libprotobuf_lite,而不是 libprotobufd 和 libprotobuf_lited,后者是调试版本。这是因为默认情况下,Properties->Linker->Input 下的附加依赖项中的路径最终提供了与 $(_ZVcpkgCurrentInstalledDir)$(_ZVcpkgConfigSubdir)lib*.lib 链接的选项,这是 protobuf 库的免费构建所在的位置.
将路径更改为 $(_ZVcpkgCurrentInstalledDir)$(_ZVcpkgConfigSubdir)debug\lib*.lib 问题解决了,异常也消失了。