Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.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
当malloc失败时,如何在不退出()的情况下结束后续代码?_C_Malloc - Fatal编程技术网

当malloc失败时,如何在不退出()的情况下结束后续代码?

当malloc失败时,如何在不退出()的情况下结束后续代码?,c,malloc,C,Malloc,在开发移动应用程序时(内存有限,大约2Mb或更少),在malloc()失败时,我添加了一个回调来向UI报告错误,但是后续代码仍然需要检查malloc()的返回值,这可能会导致大量脏代码(检查返回的内存是NULL还是分配失败导致的false返回代码)。有没有一种优雅的方法可以在不退出整个应用程序的情况下终止连续的代码?你的意思是“有没有一种优雅的方法可以在内存分配失败后继续” 是的,有点像,但很难做对。通过玩setjmp和longump你可以给自己一些类似于try/catch的紧急恢复系统,但是你

在开发移动应用程序时(内存有限,大约2Mb或更少),在
malloc()
失败时,我添加了一个回调来向UI报告错误,但是后续代码仍然需要检查
malloc()
的返回值,这可能会导致大量脏代码(检查返回的内存是
NULL
还是分配失败导致的
false
返回代码)。有没有一种优雅的方法可以在不退出整个应用程序的情况下终止连续的代码?

你的意思是“有没有一种优雅的方法可以在内存分配失败后继续”

是的,有点像,但很难做对。通过玩
setjmp
longump
你可以给自己一些类似于try/catch的紧急恢复系统,但是你必须非常小心地清理掉调用堆栈

此外,在清理开始实际清理分配的内存之前,对malloc的任何后续调用都可能失败


大多数情况下,优雅将涉及确保将错误状态传递回调用堆栈,并在任何地方处理它。

您的意思是“内存分配失败后有没有优雅的方法继续?”

是的,有点像,但很难做对。通过玩
setjmp
longump
你可以给自己一些类似于try/catch的紧急恢复系统,但是你必须非常小心地清理掉调用堆栈

此外,在清理开始实际清理分配的内存之前,对malloc的任何后续调用都可能失败


大多数情况下,优雅需要确保您将错误状态传递回调用堆栈,并在任何地方处理它。

那么您想通过一些弹出窗口通知用户,然后终止吗

我不知道您使用的是什么库-在win32中,它与模式窗口一样简单 有自己的消息循环,因此不需要退出启动模式对话框的函数

不管怎样,在模式对话框完成后调用退出。如果需要一些真正的清理逻辑- 这很难,而且我认为是关于整个程序的结构和设计

更新

顺便说一句,如果内存真的很低,甚至弹出可能会失败。

那么您想通过一些弹出窗口通知用户,然后终止吗

我不知道您使用的是什么库-在win32中,它与模式窗口一样简单 有自己的消息循环,因此不需要退出启动模式对话框的函数

不管怎样,在模式对话框完成后调用退出。如果需要一些真正的清理逻辑- 这很难,而且我认为是关于整个程序的结构和设计

更新

顺便说一句,如果内存真的很低,甚至弹出窗口也可能会失败。

如果您想终止所有后续代码,那么为什么退出
不是一个选项?您可以将后续代码放在一个单独的函数中,并且只有在malloc成功时才执行该函数。这样,您只需再进行一次检查,并且没有过多的检查indentation@nyarlathotep:事实上,我将
malloc()
封装为
xmalloc()
,几乎所有模块都需要它来请求内存,我认为这不是一种明智的方式在一个单独的函数中连续的代码。@nshy:我同意这种方式,但UI模块认为这不是一种优雅的方式,这就是为什么我添加了一个回调来报告分配失败,就像上面说的:“内存不足…”然后等待用户终止应用程序。直接退出看起来像是一个崩溃,用户可能认为这是一个严重的错误。如果你想终止所有后续代码,那么为什么
exit
不是一个选项?你可以将后续代码放在一个单独的函数中,并且只有在malloc成功的情况下才执行。这样,你只需要再进行一次检查和验证不过分indentation@nyarlathotep:实际上,我将
malloc()
封装为
xmalloc()
,几乎所有模块都需要它来请求内存,我认为这不是一种明智的方式在一个单独的函数中连续的代码。@nshy:我同意这种方式,但UI模块认为这不是一种优雅的方式,这就是为什么我添加了一个回调来报告分配失败,就像上面说的:“内存不足…”然后等待用户终止应用程序。直接退出看起来像一个崩溃,用户可能认为这是一个严重的错误。如果设备运行Win32,我认为内存至少会达到256Mb…我认为最好的方法是退出(),没有其他优雅的选项:)如果设备运行Win32,我认为内存至少会达到256Mb…我认为最好的方法是退出(),没有其他优雅的选项:)