发生了什么事?!我在我的代码中修复了一些结构,大量的搜索/替换。然后我完成了,一切都编译得很好,但程序立即崩溃。
这是我的主要功能:
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已更改。
答案 0 :(得分:2)
在程序启动之前调用全局和静态对象的构造函数。 (但我不确定这与WinMain()
如何相互作用。)
在调试器下运行您的应用程序以查看它是如何崩溃的。
从您添加的说明中,似乎std::string
初始化为NULL
指针,这是不允许的。您是否有使用NULL
/ 0
初始化的全局/静态字符串?当您将变量的类型从char*
(或char[]
)更改为std::string
时,通常会发生这种情况。
答案 1 :(得分:0)
正如@sbi所说,它可能是全局/静态对象。根据我的经验,如果字符串对象位于由其他全局对象/初始化代码引用的全局范围内,则会发生这种情况(通常是?)。由于非确定性初始化顺序,字符串可以在构造之前使用。我会查找这些情况(如果可能的话,请避免使用全局代码)。
另一方面,任何对象都可能发生这种情况,而不仅仅是字符串。通常不是对象没有被正确初始化,而是在初始化之前有些东西正在使用它(尽管@ sbi的答案也可能是原因)。