【问题标题】:ifstream fails because I'm running out of file descriptorsifstream 失败,因为我的文件描述符用完了
【发布时间】:2014-04-09 17:54:22
【问题描述】:

我在 OSX 10.9.2 上使用 Xcode5/clang。 我的程序开始起作用了

std::ifstream file(path);
if (!file.is_open())
    throw std::runtime_error("somethings wrong");

在几百(或几千?)个打开和关闭文件之后。 发生这种情况时,我无法再打开任何文件,无论是使用 fstream 还是使用 fopen(),这让我觉得我用完了文件描述符。 根据 ifstream 上的文档,当 fstream 对象被销毁时,文件会关闭。我所有的 fstream 对象都存在于堆栈中,我从不使用 new 分配任何对象,所以如果我的堆栈被正确清理,我不必调用 fstream::close() 因为当对象超出范围时,文件是关闭。

但显然,我仍在某处泄露文件描述符。

问题: 1.如果按计划清理了steam对象,我会用完文件描述符吗?比如,文件描述符可以在关闭后重新使用,还是一旦使用和关闭就永远消失了? 2. 有没有办法可以泄漏 fstream 对象,让它们保持打开状态,即使它们都存在于我的堆栈中?

【问题讨论】:

  • 请提供更多您的程序以显示上下文。你不会递归调用它吧?
  • 你在 Linux 上吗?您可以通过查看 /proc/ 来检查文件描述符,其中 是您正在运行的程序的进程 ID。其他 unix 上也有类似的东西。

标签: c++ file-io memory-leaks fstream


【解决方案1】:

没关系,我发现了我的问题。

我根本没有泄漏 fstream 对象,但我一直在疯狂地泄漏 sqlite 句柄。 我是通过仔细使用发现的

lsof -p my_processes_pid | wc

lsof 是一个非常有用的命令!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多