c++ - fopen 几分钟后无法打开文件
问题描述
我想在文件中写一些日志。
这是我的代码:
FILE *writefile = fopen((Dir + FileName).data(), "at");
if (writefile)
{
fprintf(writefile, log.data());
fclose(writefile);
}
当我第一次尝试写作时,它肯定会起作用。
此代码在网络系统中执行,但在无连接状态下执行。
所以,它每秒都在写日志“Try Connct”。
我可以在我的控制台上看到这些日志。
在图像中,我尝试在 11:10:00 写入日志。
但在 File 中,直到 11:06:00 才写入。
我尝试调试我的代码,
为什么会发生这种情况?
- -添加 - -
我尝试打印错误。所以,我用了perror。
我收到错误:打开的文件太多。
但为什么?显然我关闭了文件,正如您在我的代码中看到的那样。
解决方案
您的程序中存在资源泄漏。open
/ dup
/ fopen
/ stream::open
/ pipe
/ / /没有匹配/ connect
/ accept
/的调用太多。socket
close
fclose
~stream
stream::close
如果发生FILE
泄漏,您可以通过以下方式之一避免它:
- 在所有代码中使用
ofstream
而不是。当文件超出范围时,它将自动关闭文件。FILE
- 将FILE 的 unique_ptr 与自定义删除器一起使用。当文件超出范围时,这将自动关闭文件。
不幸的是,没有简单的方法可以找到这个泄漏。最好的方法是从一开始就避免它,将RAII与std::stream
, std::unique_ptr
和boost asio一起使用。由于代码没有遵循这个规则,唯一的出路是fopen
通过代码搜索(和其他人),并使其使用 RAII,可能使用unique_ptr
.
推荐阅读
- regex - 正则表达式使用 Google Apps 脚本格式化字符串中的数字
- java - Java自定义注解创建
- eclipse - Eclipse 的 Scala 测试问题,无法运行
- github-pages - Gatsby 图像不工作 - 部署时图像模糊或根本不显示
- web-scraping - 使用 BeautifulSoup 检索 Google Scholar 结果的问题
- bash - 如何在 if 语句中使用 REGEX
- excel - 如果满足条件,则创建数据列表
- c# - 在 ASP.NET Core 3.1 中使用带有 HttpContext.Response 的新 Json 序列化程序
- android - 将下拉列表作为布局中的视图,如 relativelayout 或 anthor 视图
- python - Visual Studio 2015中python程序的错误输出