C编程中的内存处理策略是什么?

bod*_*ydo 7 c memory malloc

我自己的一个策略是在程序启动时分配5兆字节的内存(或者你认为必要的任何数字).

然后,当程序malloc()返回任何一点时NULL,你释放5兆字节并malloc()再次调用,这将成功并让程序继续运行.

您对此策略有何看法?

你还知道其他什么策略?

谢谢,Boda Cydo.

小智 13

通过优雅地退出来处理malloc故障.使用现代操作系统,页面文件等,您永远不应先发制人地支持内存故障,只需优雅退出即可.除非您有算法问题,否则您不太可能遇到内存不足错误.

此外,在启动时无缘无故地分配5MB是疯狂的.

  • 虽然无缘无故地分配5MB并不是一个好主意,但拥有一个可用的保留内存块来协助优雅的退出并不是一个坏主意.MS为低级错误报告保留一个小的静态缓冲区.这为他们提供了一个位置,USER32可以使用该位置格式化消息并将其显示给用户.到那时,恢复不是一种选择,但它可能有助于在将来识别和预防该问题.应用程序中的类似内容可能很有用. (5认同)
  • “除非遇到算法问题,否则不太可能会遇到内存不足错误。” 听起来有点像“没有人需要超过640k RAM”。如果您在32位计算机上工作,并且进程需要1 GB的数据,则很容易遇到由于内存碎片而无法分配5 MB的情况。 (2认同)
  • @nikie,这不是真的.http://en.wikipedia.org/wiki/Virtual_memory (2认同)
  • @evilclown:内存碎片与物理内存无关,而是**虚拟**地址空间的碎片化.您无法将对象移动到不同的虚拟地址,因为指向它们的指针将不再有效. (2认同)

Spa*_*rky 5

在过去几年中,我一直使用的(嵌入式)软件通常不允许使用malloc().唯一的例外是它在初始化阶段是允许的,但是一旦确定不允许更多的内存分配,所有将来对malloc()的调用都会失败.由于malloc()/ free()导致内存可能变得碎片化,因此在很多情况下最好很难证明将来对malloc()的调用不会失败.

这种情况可能不适用于您的情况.但是,知道malloc()失败的原因可能很有用.我们在代码中使用的以下技术,因为malloc()通常不可用,可能(或可能不)适用于您的场景.

我们倾向于依赖内存池.每个池的内存在瞬态启动阶段分配.一旦我们拥有了这些池,我们就会在需要时从池中获取一个条目,并在完成后将其释放回池中.每个池都是可配置的,通常保留用于特定的对象类型.我们可以跟踪每个时间段的使用情况.如果我们用完了池条目,我们可以找出原因.如果我们不这样做,我们可以选择缩小我们的游泳池并节省一些资源.

希望这可以帮助.