C++ 程序启动前断言失败

C++ 程序启动前断言失败,c++,windows,visual-studio-2008,C++,Windows,Visual Studio 2008,怎么回事?!我修复了一些结构,在代码中进行了大量的搜索/替换。然后我完成了,所有的东西都编译好了,但是程序立即崩溃了 这是我的主要职能: int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){ exit(1); 在所有逻辑中,它都不应该崩溃,因为我不执行任何功能。只有WinMain(),它什么也不做 怎么回事?为什么不再给我行号了?它给出了外部inc

怎么回事?!我修复了一些结构,在代码中进行了大量的搜索/替换。然后我完成了,所有的东西都编译好了,但是程序立即崩溃了

这是我的主要职能:

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow){
    exit(1);
在所有逻辑中,它都不应该崩溃,因为我不执行任何功能。只有WinMain(),它什么也不做

怎么回事?为什么不再给我行号了?它给出了外部include文件中的位置,而不是代码中的行

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

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

File: ... \include\xstring
Line: 1084
Expression: Invalid null pointer
当我在非调试模式下运行它时,我在0x00413a95处得到
第一次机会异常…:0xC0000005:访问冲突读取位置0x00000000。

--


Edit2:找到原因:我用以下方式初始化了一个全局结构:
const StructName VarName={1,1,1}但StructName Struct已更改。

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

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


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

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


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

你能告诉我它崩溃的位置吗?我不记得将字符串设置为null。但是现在当我测试时,问题确实在结构中,我就是找不到问题。我删除了结构和任何指向它们的东西,程序运行正常!但我就是找不到问题。。。我没有将字符串更改为char或其他。我只是重新排列了我的结构,使其更可编辑(许多结构共享相同的变量)@Newbie:没有看到“结构”,我们也无法理解您的问题。试着把你的代码简化为一个最小的、自包含的复制案例。你很可能会发现这样做有问题。如果没有,你就有一段完美的代码回来询问。@Newbie:听起来好像有人在构造字符串之前就在使用它。i、 e.一个对象的构造函数在调用字符串的构造函数之前正在使用该字符串。@sbi:是的,正在这样做@马丁·约克:这怎么可能?你能举个例子吗?我现在让它工作了,但现在它在调试模式下崩溃了。以前没人告诉我这件事,他们都说“全球人都不好”,gg。但是我不知道如何在没有全局变量的情况下制作程序。作为一个建议,看看关于全局变量和单例变量的各种讨论,以及各种设计建议问题/线索:有很多好的信息和帮助。祝你好运@新手:这不是全球选手的主要问题。主要的问题是,因为它们没有显式地传递给修改它们的函数,所以您永远不知道哪些函数会这样做。