c++ - 动态内存分配故障恢复

标签 c++ embedded windows-ce new-operator viper

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

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

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

sleep 有帮助吗?我应该设置一些最大重试次数吗?是否可以到处使用静态初始化?

最后更新:非常感谢您提供有用的回复,但事实证明在检查内存分配失败的代码中存在错误。不过,我会牢记所有这些答案,并尽可能多地替换 malloc 和 new(尤其是在错误处理代码中)。

最佳答案

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

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

  • 进程知道它们自己的内存使用情况和需求,并不断地相互告知它们需要多少内存。它们合作,因此它们不会耗尽内存。这假设系统中至少有一些进程可以调整它们自己的内存需求(例如,通过更改内部缓存的大小)。阿隆索和阿佩尔写了一篇 paper about this approach .

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

您上面的建议不符合任何一种情况。相反,您希望其他一些过程可以解决问题,并且您需要的内存最终会出现。你可能会走运。你可能不会。

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

关于c++ - 动态内存分配故障恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/367310/

相关文章:

c++ - mk-livestatus 1.1.6p1 无法在 Ubuntu 12.04 上编译(精确)

android - 生成跨平台应用

c - 编写 AT 命令嵌入式 linux

c# - 如何在 Windows CE 6.0 设备中配置 VPN 客户端

c++ - 在 C++ 程序中更改标准输出的值

c++ - std::chrono time_since_epoch 的默认持续时间

c++ - 为什么编译器选择这个模板函数而不是重载的非模板函数?

embedded - 链接器和体系结构

windows-ce - Windows CE 6.0 上的 Hklm/Init

wcf - 使用 WCF 服务的 Win CE 6.0 客户端 - 减少带宽