【问题标题】:What is unhandled excpetion error mean?未处理的异常错误是什么意思?
【发布时间】:2014-04-04 23:26:29
【问题描述】:

我在 Visual Studio(一个 C 程序)中编写,我收到此错误:SciComput.exe 中 0x77dd3e14 处的未处理异常:0xC0000005:访问冲突读取位置 0xff630018。

有人可以向一个非常绝对的初学者解释这是什么意思吗?

【问题讨论】:

  • 简而言之,就是你的程序崩溃了。您应该构建程序的调试版本,并在调试器中运行。它会在崩溃发生时停止,让您检查并向上走函数调用堆栈,还可以检查变量及其值。
  • 程序使用的内存有限制。程序“SciCompute.exe”试图访问超出其限制的内存。因此“访问冲突读取(内存)位置 0xff630018。”
  • 可能意味着很多事情...例如您的应用程序在某个地方抛出了异常(例如除以零,或尝试读取文件而不检查文件是否存在)...或特定的“抛出”(如果是 C++)或写入一块不属于您的内存,取消引用 NULL 指针......以及数百万其他原因......
  • @Joachim Pileborg 有没有办法在 Visual Studio 中进行调试工作?
  • 是的,VS 以拥有非常好的调试器而闻名。我相信您可以在其中一个菜单中轻松找到在调试器中运行的选项(目前没有可用的 VS,所以不知道是哪一个)。

标签: c visual-studio


【解决方案1】:

除了 Eutherpy 的好答案之外,我还要补充一点,访问冲突通常来自尝试读取或写入 NULL,即位置 0。位置 0xff630018 肯定是越界,但也绝对不为零;这里发生了一些奇怪的事情。

Windows 为进程的“用户”那一半保留了底部 2GB 的虚拟地址空间——也就是说,代码实际上正在进程中运行。前 2GB 的地址从 0x80000000 到 0xffffffff 保留供操作系统使用,以存储与您的进程相关的数据。任何从用户代码访问操作系统拥有的内存的尝试都将立即导致访问冲突。但是为什么您的程序首先会尝试访问操作系统内存?

就像我说的,这里发生了一些奇怪的事情。可能存在一些其他内存损坏,然后在此行为中表现出来;这可能是一些完全不同的错误的症状。

这些很难追踪。祝你好运!

【讨论】:

    【解决方案2】:

    这意味着您正在尝试访问不“属于”您的程序的内存段,即您尚未分配、保留的内存。

    通常,导致此类错误的原因是尝试写入只读内存取消引用 NULL 指针

    “未处理的异常”意味着您没有为程序提供在错误发生时处理错误的方法,因此它只是崩溃了。

    注意:您可以通过 C++ 中的 try...catch 机制处理异常。但是http://msdn.microsoft.com/en-us/library/6dekhbbc.aspxC 不支持这个。

    【讨论】:

    • 这很有帮助。但我只用 C 语言编写。有没有办法分配“正确”的内存?我的意思是不是只读之类的?
    • C++ try catch 仅适用于 throw 的 C++ 异常,不适用于此类程序崩溃。
    • 是的(例如malloc),但您的问题不一定与此有关。
    • 其实我是用malloc来分配内存的,但是,我不能选择“正确”的内存来分配。
    猜你喜欢
    • 2010-12-19
    • 1970-01-01
    • 2016-11-11
    • 2013-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多