Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当堆损坏时,是否有任何方法防止应用程序崩溃C程序设计语言_C_Memory_Free_Heap - Fatal编程技术网

当堆损坏时,是否有任何方法防止应用程序崩溃C程序设计语言

当堆损坏时,是否有任何方法防止应用程序崩溃C程序设计语言,c,memory,free,heap,C,Memory,Free,Heap,有时在执行过程中,我在VS2010中尝试释放内存时会收到以下错误消息: Windows已在[APPNAME].exe中触发断点 这可能是由于堆损坏,这表明[APPNAME].exe或其加载的任何DLL中存在错误 这也可能是因为用户在[APPNAME].exe具有焦点时按F12 输出窗口可能有更多诊断信息 Wich表示堆或指针有问题 我的问题是,当我的应用程序构建为发行版时,此错误会使其崩溃 此外,这只是一个更大的应用程序模块,当它崩溃时,一切都会停止 我希望能够处理这个错误 从msdn中选择“免

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

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

这可能是由于堆损坏,这表明[APPNAME].exe或其加载的任何DLL中存在错误

这也可能是因为用户在[APPNAME].exe具有焦点时按F12

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

Wich表示堆或指针有问题

我的问题是,当我的应用程序构建为发行版时,此错误会使其崩溃

此外,这只是一个更大的应用程序模块,当它崩溃时,一切都会停止

我希望能够处理这个错误

从msdn中选择“免费”:

如果释放内存时发生错误,将使用操作系统提供的有关故障性质的信息设置errno。有关更多信息,请参阅错误号、\u doserrno、\u sys\u errlist和\u sys\u nerr

有一个
errno\u t\u get\u errno(int*pValue)返回错误代码的函数

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


是否有任何编译器开关或其他东西来防止应用程序在free失败时崩溃,并允许我以自己的方式退出它???

理论上,您尝试使用SEH来防止应用程序崩溃。 AFAIK“调试断点”是一种SEH异常,可以处理

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

上述代码> > >除块外,将捕获所有异常(C++和SEH)。

但是

我相信你不应该这样做。堆损坏,以及任何其他无效内存访问-是一个错误,一旦发生这种情况-损坏通常是不可恢复的。您可以防止崩溃(希望如此),但您不能保证您的程序能够完成它应该做的事情。从现在起,它可能会在任何其他地方坠毁


与其防止崩溃,我建议你找一个敢于覆盖被禁止的内存并破坏堆的不法分子。

理论上,你可以尝试使用SEH防止你的应用程序崩溃。 AFAIK“调试断点”是一种SEH异常,可以处理

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

上述代码> > >除块外,将捕获所有异常(C++和SEH)。

但是

我相信你不应该这样做。堆损坏,以及任何其他无效内存访问-是一个错误,一旦发生这种情况-损坏通常是不可恢复的。您可以防止崩溃(希望如此),但您不能保证您的程序能够完成它应该做的事情。从现在起,它可能会在任何其他地方坠毁


与其防止崩溃,我建议您找到敢于覆盖禁止内存并损坏堆的不法分子。

修复代码,而不是试图忽略如此严重的错误。生产代码中不应该有如此严重的内存错误。好了,没有简单的方法来处理这个问题,这是有充分理由的。


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

修复代码,而不是试图忽略如此严重的错误。生产代码中不应该有如此严重的内存错误。好了,没有简单的方法来处理这个问题,这是有充分理由的。


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

如果堆损坏,则所有赌注均无效。内存分配可能会失败(除非它们在堆栈上),它们可能会返回指向异常区域的指针,甚至堆上现有的东西也可能被弄得面目全非。在这种情况下,你最好还是崩溃,因为你采取的任何行动(甚至试图优雅地退出)只会让事情变得更糟


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

如果堆损坏,则所有赌注都无效。内存分配可能失败(除非它们在堆栈上),它们可能返回指向古怪区域的指针,甚至堆上的现有内容也可能损坏得无法识别。在这种情况下,你最好还是崩溃,因为你采取的任何行动(甚至试图优雅地退出)只会让事情变得更糟

查找堆上损坏内容的代码,并修复或删除它。

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

但是,如果您正在尝试调试,并且这是一个发布版本,则此设置可能会使调试问题变得困难。听起来你有一个模块在别人的应用程序中运行(尽管我不确定你的描述)。在这种情况下,可能是另一个应用程序正在设置堆终止标志。不幸的是,一旦设置(每个进程)它就不能取消设置

当崩溃发生时,您需要附加一个调试器来生成转储文件,并尝试从中进行调试。

许多Windows程序使用
HeapEnableTerminationOnCrruption
来确保在检测到堆损坏时程序立即崩溃。这是一种安全措施,因为堆损坏可能会被利用。立即崩溃堆损坏是唯一明智的做法

但是如果你想去deb