当前位置:  开发笔记 > 编程语言 > 正文

动态内存分配失败恢复

如何解决《动态内存分配失败恢复》经验,为你挑选了1个好方法。

我正在研究嵌入式处理器(400 MHz Intel PXA255 XScale),我想我看到一个没有足够内存来满足"新"操作的情况.该程序没有崩溃,所以我假设其他线程已经释放了他们的记忆,这只是一个短暂的事情.这是一些非常关键的代码,因此退出不是一个选项,需要将某种错误返回给远程用户.

以下小修补程序是否足以解决问题,还是有更好的方法?在用以下代码替换每个'new'之前,我想我会问.

char someArr[];
do{ 
    someArr = new char[10]; 
    Sleep(100); // no justification for choosing 100 ms
} while ( someArr == NULL );

睡眠有帮助吗?我应该设置一些最大重试次数吗?是否可以在任何地方使用静态初始化?

最后更新:非常感谢您提供有用的响应,但事实证明在代码检查中存在错误的内存分配错误.我会记住所有这些答案,尽可能多地替换malloc和new(特别是在错误处理代码中).



1> Norman Ramse..:

您正试图通过本地推理解决全局问题.全局问题是整个设备对操作系统和所有应用程序具有有限数量的RAM(以及可能的后备存储).为了确保不超过此数量的RAM,您有以下几种选择:

每个进程在固定数量的RAM中运行,以便在启动时按每个进程确定; 程序员做了推理以确保一切都适合.所以,是的,可以静态分配所有内容.这只是很多工作,每次更改系统配置时,都必须重新考虑分配.

进程知道自己的内存使用情况和需求,并不断向对方建议他们需要多少内存.他们合作,所以他们不会耗尽记忆.这假设系统中的至少一些进程可以调整它们自己的存储器要求(例如,通过改变内部高速缓存的大小).Alonso和Appel写了一篇关于这种方法的论文.

每个进程都意识到内存可能会耗尽,并且可以故障转移到消耗最少内存量的状态.通常,这种策略是通过内存异常来实现的.异常在main()中或附近处理,并且内存不足事件实质上从头开始重新启动程序.如果内存响应用户请求而增长,则此故障转移模式可以工作; 如果程序的内存需求增长与用户的行为无关,则可能导致颠簸.

上面的提议与所有方案都不匹配. 相反,您希望其他一些过程可以解决问题,最终会出现您需要的内存.你可能会很幸运.你可能不会.

如果您希望系统可靠地工作,那么考虑到共享有限内存的需要,您最好重新考虑系统上运行的每个进程的设计.它可能比你预期的更重要,但如果你理解这个问题,你就可以做到这一点.祝好运!

推荐阅读
手机用户2402852387
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有