到底是怎么回事?! 我修复了一些结构,在我的代码中大量的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
。