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

Ann*_*inn 6 c++ error-handling memory-management

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

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

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

Jas*_*son 1

您的问题的简短答案是“可能不会”(请参阅​​此答案:/sf/answers/472013951/)。snprintf() 的开源版本不使用动态分配。我会使用它和 mmap(2) 写入您的文件。

我猜您想使用 cstdio 的原因是您已经拥有一些使用 cstdio 的精美日志记录/序列化代码。鉴于此,我暂时将这个解决方案保持在较高水平。

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

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

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

如果您尝试保存的数据量很大(例如大于一页)并且可变,您可以简单地分配一页缓冲区并一次构建一页日志文件。或者你可以这样做/sf/answers/609282271/

HTH。

——杰森