代码之家  ›  专栏  ›  技术社区  ›  Brlja

当堆损坏时,有什么方法可以防止应用程序崩溃吗?-C程序设计语言

  •  1
  • Brlja  · 技术社区  · 16 年前

    有时在执行过程中,我在VS2010中尝试释放内存时收到以下错误消息:

    Windows在[APPNAME].exe中触发了断点。

    这也可能是由于用户在[APPNAME].exe具有焦点时按下F12。

    输出窗口可能有更多的诊断信息。

    而且,这只是一个更大的应用程序的模块,当这个模块崩溃时,每个模块都会崩溃。

    我希望能够处理这个错误。

    来自msdn的“免费”:

    有一个 errno_t _get_errno( int * pValue ); 返回错误代码的函数。

    如果我按上面显示的错误消息继续,这个函数返回错误代码。 使用这段代码,我可以检测错误,创建调用堆栈并轻轻退出函数。

    4 回复  |  直到 16 年前
        1
  •  8
  •   cHao    16 年前

    如果堆已损坏,则所有赌注都将取消。 内存分配可能会失败(除非它们在堆栈中),它们可能会返回指向奇怪区域的指针,甚至堆中现有的内容也可能会被弄得面目全非。在这种情况下,你最好还是撞车 你所采取的行动(甚至试图优雅地退出)只会让事情变得更糟。

    找到损坏堆上的内容的代码,然后修复或删除它。

        2
  •  4
  •   valdo    16 年前

    从理论上讲,你试图用SEH来防止你的应用程序崩溃。 AFAIK“debug breakpoint”是一种SEH异常,可以处理。

    __try {
        // do something here
    } __except(EXCEPTION_EXECUTE_HANDLER) {
    }
    

    __try / __except 块将捕获所有异常(C++和SEH)。

    我认为你不应该这样做。堆损坏以及任何其他无效内存访问-是 缺陷 不可恢复 . 你呢 可以

    查找

        3
  •  4
  •   Karel Petranek    16 年前

    修复代码,而不是试图忽略如此严重的错误。你不应该在你的产品代码中有如此严重的内存错误。虽然没有简单的方法来处理这件事,这是有原因的。

    顺便说一句,我以为对话框只在调试模式下出现。在释放模式下,不应检测到内存错误,应用程序应立即崩溃(或使用损坏的堆yuk运行)。

        4
  •  0
  •   Adrian McCarthy    16 年前

    许多Windows程序使用 HeapSetInformation 具有 HeapEnableTerminationOnCorruption 以确保程序在检测到堆损坏时立即崩溃。这是一种安全措施,因为堆损坏可能会被利用。要做的唯一明智的事情就是立即崩溃。