gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:55 28 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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

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

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

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

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

HTH.

--杰森

关于c++ - 将 "Out of Memory"错误写入文件,没有内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20992035/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com