2014-01-08 51 views
6

我想记录,并可能向用户发出警告,如果该程序应耗尽内存,让他们有机会尝试一些释放(希望)。虽然我可以预分配给显示的情况所需要的必要的GUI的实体,我担心的是,使用更基本的操作cstdio如打开或写入文件,在这种情况下是不可能的。将“内存不足”错误写入文件,无内存?

我的问题是,如果一个程序不能再动态分配内存,是否仍然可以使用cstdio?我是否需要采取特殊措施,例如预先打开文件,或将其设置为不使用缓冲区?请问cstring功能仍然可以运作?在这种情况下需要了解哪些其他可能的障碍?

(警告用户在这种情况下的奢侈品,主要目标是错误记录到文件中,然后尝试用cstdio抢救的相关数据,然后向用户发出警告,按照这个顺序)

+3

当你得到这个错误可能为时已晚,但你有同样的错误,即使你无法分配足够的**的连续空间**所以其他操作工作,即使一个分配请求失败。我建议警告用户(并记录)空闲内存何时低于阈值**(此检查的执行频率取决于您的分配模式)。 –

+0

现在,内存并没有预先汇集起来,它只是在需要的时候从操作系统中抓取。 (需要尽快改变)。尽管分配内存的方式,它会在记录/警告之后重新尝试分配内存。除非程序试图在此之后分配更多内存(并导致崩溃),否则该方案不会更改,应该有可能恢复(希望!) –

+8

我们尝试解决这个问题的方法之一是在注册我们的异常处理程序时分配缓冲区,然后如果发生异常,我们将释放缓冲区并希望有足够的内存来允许处理程序写出它需要的数据。 –

回答

1

短回答你的问题是“可能不是”(见这个答案:https://stackoverflow.com/a/6743056/789491)。有些开源版本的snprintf()不使用动态分配。我会用它和mmap(2)写入你的文件。

我猜你想使用cstdio是你已经有一个使用cstdio一些花哨的记录/序列化代码的原因。鉴于此,我现在将把这个解决方案保持在高水平。

在这种情况下,在开始的时候我会分配大到足以容纳你的错误信息,并恢复数据的缓冲器(一拉@退休忍者)。尽管(我的Linux机器上有4096个字节),但我至少将缓冲区的大小设置为一页。我也打开我想要写入的日志文件和mmap(2)该文件,并使用我希望的缓冲区大小。

在我的内存不足异常处理程序中,我首先释放缓冲区(以便给我一些内存来处理),并使用snprintf的malloc免费版本在mmap'd文件中构造错误消息。然后,我会fsync文件(我没有跟踪fsync源代码来验证它是否分配了内存,或者分配了多少内存,但它应该小于cstdio)。然后关闭文件,做任何你想要的(GUI处理等),然后退出。

当我的程序正常退出,我只是删除我用MMAP创建的日志文件。

如果你想保存的数据量较大时(说比一个页面大)而变,你可以简单地分配一个页面的缓冲区,并在同一时间建立你的日志文件中一页。或者你可以这样做https://stackoverflow.com/a/8704032/789491

HTH。

--Jason