在Cocoa中处理malloc失败的最佳方法

时间:2009-12-28 08:38:06

标签: cocoa exception malloc

虽然它不会经常发生,但有几种情况我的Cocoa应用程序将分配非常大量的内存,足以让我担心malloc失败。在Cocoa应用程序中处理此类故障的最佳方法是什么?我听说在这个开发环境中通常不鼓励例外情况,但这是一个有用的情况吗?

3 个答案:

答案 0 :(得分:5)

如果由于内存不足而导致分配失败,则更有可能在某个框架中出现分配错误,导致应用程序处于未确定状态。

即使不是这种情况,你也不能做任何事情,它会分配内存并且只留下很少的选择。

即使释放内存以试图“修复”问题也不会一直有效,甚至不能通过显示一条漂亮的错误消息并彻底退出来“修复”它。

您也不想尝试从此状态保存数据。或者,至少,并非没有编写处理读取损坏数据所需的所有代码(因为很可能失败的分配意味着某些代码在某处损坏了内存)。

将分配失败视为致命,记录和退出。

对于正确编写的应用程序内存不足,非常不常见。更有可能的是,当应用程序内存不足时,用户的系统将会像地狱一样分页,因此,在分配失败之前,性能已经显着下降。

专注于优化和减少内存使用的投资回报将比尝试从分配失败中恢复更高。

(Alan的原始答案和他的编辑一样准确。)

答案 1 :(得分:1)

如果遇到内存分配错误,则不应尝试处理它们,而应重新考虑应用程序如何使用内存。

我不确定Cocoa的成语是什么,但对于C ++和C#至少,内存不足异常是更大问题的标志,最好由用户/操作系统来处理。

说你的内存分配失败,你的系统还能做什么?剩下多少内存?在关闭之前显示对话框/打印消息是否足够?抛出异常会成功吗?清理资源会导致级联内​​存异常吗?

如果malloc失败,你将得到一个空值,所以如果是这样的话,你的应用程序可以继续没有内存吗?如果没有,请将该条件视为致命错误,并使用用户有用的消息退出。

答案 2 :(得分:0)

如果内存不足,通常没有什么可以做不到终止你的应用程序。即使显示通知也可能失败,因为没有足够的内存。

C应用程序中的标准是编写一个void xmalloc(size_t size);函数来检查malloc的返回值,如果是NULL,则向stderr打印一个错误,然后调用abort()。这样,您只需在代码中使用xmalloc,就不要考虑它。如果你内存不足,运气不好,你的应用程序就会死掉。