程序启动之前的断言失败

到底是怎么回事?! 我修复了一些结构,在我的代码中大量的search/replace。 然后我完成,一切都编译好,但程序立即崩溃。

这是我的主要function:

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

在所有的逻辑它不应该崩溃,因为即时通讯不执行任何function。 只有WinMain(),它什么都不做!

我勒个去? 为什么它不再给我行号呢? 它在外部包含文件中提供位置,而不是在我的代码中的行。

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

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

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

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

编辑2:find原因:我用下面的方法初始化一个全局结构: const StructName VarName = {1, 1, 1}; 但是StructName Struct被改变了。

正如@sbi所说,这可能是全球/静态的对象。 根据我的经验,如果一个字符串对象位于被其他全局对象/初始化代码引用的全局作用域中,就会发生这种情况(通常是?)。 由于不确定的初始化顺序,字符串可以在构建之前使用。 我会寻找这些情况(嗯,如果可能,避免全局代码)。

在旁注中,这可能发生在任何对象上,而不仅仅是字符串。 通常不是对象没有被正确初始化,而是在初始化之前有东西正在使用它(尽管@sbi的回答也可能是原因)。

全局和静态对象的构造函数在程序启动之前被调用。 (我不知道这是如何与WinMain()交互WinMain()

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

从你添加的描述看来, std::string是用NULL指针初始化的,这是不允许的。 你有一个用NULL / 0初始化的全局/静态字符串吗? 这通常发生在将变量的类型从char* (或char[] )更改为std::string