【发布时间】: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