程序开始之前断言失败

时间:2010-10-06 17:45:20

标签: c++ windows visual-studio-2008

发生了什么事?!我在我的代码中修复了一些结构,大量的搜索/替换。然后我完成了,一切都编译得很好,但程序立即崩溃。

这是我的主要功能:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    exit(1);

在所有逻辑中它不应该崩溃,因为我没有执行任何功能。只有WinMain(),它什么都不做!

到底是什么?为什么它不再给我行号?它给出了外部包含文件中的位置,而不是MY代码中的行。

另外我注意到我的EXE大小现在比以前小了5倍,这也没有意义,看起来它在某些时候停止编译,但仍然说它已编译!

编辑:这是我从错误中得到的:

File: ... \include\xstring
Line: 1084
Expression: Invalid null pointer

当我在非调试模式下运行时,我得到First-chance exception at 0x00413a95 ....: 0xC0000005: Access violation reading location 0x00000000.

-

Edit2:发现原因:我通过以下方式初始化了一个全局结构:const StructName VarName = {1, 1, 1};但是StructName Struct已更改。

2 个答案:

答案 0 :(得分:2)

在程序启动之前调用全局和静态对象的构造函数。 (但我不确定这与WinMain()如何相互作用。)

在调试器下运行您的应用程序以查看它是如何崩溃的。

从您添加的说明中,似乎std::string初始化为NULL指针,这是不允许的。您是否有使用NULL / 0初始化的全局/静态字符串?当您将变量的类型从char*(或char[])更改为std::string时,通常会发生这种情况。

答案 1 :(得分:0)

正如@sbi所说,它可能是全局/静态对象。根据我的经验,如果字符串对象位于由其他全局对象/初始化代码引用的全局范围内,则会发生这种情况(通常是?)。由于非确定性初始化顺序,字符串可以在构造之前使用。我会查找这些情况(如果可能的话,请避免使用全局代码)。

另一方面,任何对象都可能发生这种情况,而不仅仅是字符串。通常不是对象没有被正确初始化,而是在初始化之前有些东西正在使用它(尽管@ sbi的答案也可能是原因)。