将“Out of Memory”错误写入文件,没有内存?

时间:2014-01-08 09:46:49

标签: c++ memory-management error-handling

我想记录并可能警告用户程序是否应该耗尽内存,让他们有机会尝试释放一些(希望如此)。虽然我可以预先分配显示情况所需的必要GUI实体,但我担心的是在这种情况下可能无法使用cstdio进行更多基本操作,例如打开或写入文件。

我的问题是,如果程序根本无法动态分配内存,是否仍然可以使用cstdio?我是否需要采取任何特殊措施,例如将文件预先打开,或将其设置为不使用缓冲区? cstring函数是否仍能运行?在这种情况下要了解的其他任何障碍?

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

1 个答案:

答案 0 :(得分:1)

您的问题的简短回答是“可能不是”(请参阅​​此答案:https://stackoverflow.com/a/6743056/789491)。 snprintf()的开源版本不使用动态分配。我会用它和mmap(2)写入你的文件。

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

在这种情况下,我会在一开始就分配一个足够大的缓冲区来保存你的错误信息和恢复数据(la @Retired-Ninja)。我将缓冲区设置为至少一页的大小(在我的Linux机器上为4096字节)。我还打开了我要编写的日志文件,并使用我想要的缓冲区大小mmap(2)该文件。

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

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

如果您尝试保存的数据量很大(比如大于一个页面)和变量,您可以简单地分配一个页面的缓冲区并一次构建一个页面的日志文件。或者你可以做这样的事情https://stackoverflow.com/a/8704032/789491

HTH。

- 詹森