视觉C运行时有一个常见的错误:

该应用程序已要求运行时间以异常的方式终止它。
请联系应用程序的支持团队以获取更多信息。

这个错误消息实际上是什么意思是


让我用一个寓言来确切地解释我的要求。

如果我看到一条消息:

Exception: access violation (0xc0000005), Address 0x702be865

违反访问与性骚扰无关,或者有人试图闯入我的计算机(一般失败是一位试图阅读我的C驱动器的准将Windows 95)。

在这种情况下,访问冲突 对应于常数EXCEPTION_ACCESS_VIOLATION(声明于winbase.h值为 0xC0000005)。EXCEPTION_RECORD结构。ACCESS_VIOLATION意味着程序试图读取或写入内存中不应该的地址。

这是通常当程序有一个指向无效或不再有效的内存的指针时引起。

Note : 我是not问:

  • 为什么是程序x收到 C0000005 错误?
  • 为什么我的代码出现访问冲突?
  • 如何调试访问冲突?

所以如果我问你what causes an access violation ,您不会告诉我检查堆栈跟踪,或观察输出窗口,或发布示例代码。“It is from trying to access memory that isn’t valid.”

回到我的问题

以下错误是什么意思:

This application has requested the Runtime to terminate in an unusual way.

我(相当)确定 Microsoft Visual C 运行时库没有函数:

void TerminateRuntime(bool UnusualWay);

所以我必须尝试弄清楚它的实际含义:

  • 这意味着什么terminateVisual C 运行时库?
  • 什么会是usual终止 MSVCRT 的方法?
  • 有人会吗choose 终止它异常方式?
  • 是今天的unusual 实际上,这是一种早已被弃用的形式usual路吗?
  • 如果我 (错误地)以不寻常的方式终止它,我会做什么来终止它通常方式?

换句话说:MSVCRT 捕获了什么错误,并隐藏在无信息的错误消息后面?

答案

当您收到该消息时abort()函数被调用。

来自 MSDN:

中止

中止当前进程并返回错误代码。

void abort( void );

返回值

abort不将控制返回给调用进程。

评论

默认情况下,abort例程打印消息:

“此应用程序已请求运行时以不寻常的方式终止它。请联系应用程序的支持团队以获取更多信息。”

似乎在最新版本的 VC 运行时中,该消息已被替换为"abort() 已被调用",也许是为了澄清它的真正含义。abort()

在内部,当abort()被调用,它调用一个函数_amsg_exit,在internal.h中定义,它基本上"向控制台应用程序的stderr发出运行时错误消息,或在Windows应用程序的消息框中显示消息"。

cmsgs.h:

#define _RT_ABORT_TXT  "" EOL "This application has requested the Runtime to terminate it in an unusual way.\nPlease contact the application's support team for more information." EOL

以及传入的错误代码 (_RT_ABORT) 在 rterr.h 中定义:

rterr.h

#define _RT_ABORT  10  /* Abnormal program termination */

因此,或者,您可以通过调用来重现此内容_amsg_exit( _RT_ABORT )


Update by question poster : 在我问这个问题两周后,Raymond Chen 在自己的博客中回答了这个问题:

您正在运行程序,然后它突然退出并显示以下消息*此应用程序已请求运行时以异常方式终止它。*发生了什么?

该消息已打印通过C运行时函数abort,同样的函数也会导致你的程序以退出代码 3 终止

您的程序可能会显式调用 abort,也可能最终由运行时库本身隐式调用。

C 标准阐明了在什么条件下terminate被称为,而且它的列表很长,所以我不会在这里重复它们。

来自: stackoverflow.com