在 Visual C 运行时中,有一个常见的错误会被抛出:
此应用程序已请求 Runtime 以不正常的方式终止。
请联系应用程序支持团队了解更多信息。
这个错误消息到底是什么意思呢?
让我用一个寓言来解释我的问题。
如果我看到一条消息:
异常:访问冲突 (0xc0000005),地址 0x702be865
这个“访问冲突”与性骚扰或某人试图侵入我的计算机没有任何关系(就像“General Failure”不是一个少将,他试图读取我的C盘一样,或者你被拘留在 Windows 95 中执行非法操作)。
在这种情况下,“访问冲突”对应于常量EXCEPTION_ACCESS_VIOLATION
(在winbase.h
中声明,并具有值0xC0000005)。这个常量是可以在EXCEPTION_RECORD
结构中返回的一种可能的异常错误代码。代码ACCESS_VIOLATION
的意思是程序试图读取或写入它不应该访问的内存地址。如果你尝试从未分配的内存地址读取数据,那么你正在做一些非常糟糕的事情——异常信息就是这样告诉你的。
通常情况下,这种错误是由程序拥有指向无效的内存地址的指针引起的。解决方法是停止尝试访问无效的内存地址。
注意:我不是在问以下问题:
- 为什么程序x会收到C0000005错误?
- 我的代码为什么会出现访问冲突?
- 如何调试访问冲突?
所以,如果我问你:是什么导致了访问冲突?,你不会告诉我去检查堆栈跟踪、观察输出窗口或发布示例代码。你会说:"是因为试图访问无效的内存地址。"
回到我的问题
以下错误消息是什么意思:
此应用程序已请求 Runtime 以不正常的方式终止。
我(相当)确定 Microsoft Visual C 运行时库没有一个这样的函数:
void TerminateRuntime(bool UnusualWay);
所以我必须尝试弄清楚它实际上意味着什么:
- 什么是终止Visual C运行库的意思?(msvcrt是一个dll;你不会终止它,你只是不再使用它)
- 通常的终止MSVCRT的方法是什么?
- 会有人选择用不寻常的方式来终止它吗?
- 今天的不寻常的方式是否实际上是很久以前曾经是通常方式的已过时形式?
- 如果我错误地用一种不寻常的方式终止它,我该如何用通常的方式来终止它?
换句话说:MSVCRT捕获了什么错误,并将其隐藏在不具信息性的错误消息后面?