ifstream 失败,因为我的文件描述符用完了

ifstream fails because I'm running out of file descriptors

本文关键字:描述 文件 失败 因为 我的 ifstream      更新时间:2023-10-16

我在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.即使按计划清理了ifsteam对象,我也能用完文件描述符吗?比如,文件描述符在关闭后可以重新使用吗?或者,一旦使用并关闭,它们会永远消失吗?2.有没有一种方法可以泄漏fstream对象,让它们保持打开状态,即使它们都在我的堆栈中?

尽管如此,我还是发现了我的问题。

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

lsof -p my_processes_pid | wc

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