我只是对这个问题感到好奇:忘记调用std :: ofstream关闭函数会导致内存泄漏吗?我举了下面的例子来说明我的问题:
using namespace std;
ofstream myfile;
myfile.open ("C:\\report.html");
myfile << "<html lang=\"en\"> " << endl;
myfile << "<head>" << endl;
Normallly,我们也应该在代码脚本的末尾调用myfile.close()
。但是,如果我忘了调用关闭功能,会发生什么?它会导致内存泄漏吗?我在linux中使用了memcheck
和valgrind
来检查程序,并且没有找到内存泄漏。那么如果没有调用close函数会有什么副作用。
答案 0 :(得分:5)
当您的std::ofstream
对象超出范围时,由于使用RAII
并自动调用对象析构函数,它将自动关闭。
在这种情况下,您的代码是完全可以接受的,并且不会导致内存泄漏。根本不需要手动关闭。
如果您希望在超出范围之前重用该对象,则仅使用close
,即如果ofstream对象是类的成员并且您希望重新使用它,则可以调用{{1}在它上面,然后用另一个文件等重新打开它。
答案 1 :(得分:3)
没有。当ofstream
超出范围时,它将被销毁,关闭它。
想象一下,如果在允许容器超出范围之前必须确保每个ofstream
,请使用容满close
的容器是多么困难。
答案 2 :(得分:2)
忘记调用std :: ofstream关闭函数会导致内存泄漏吗?
不在你的情况下:ofstream
有一个析构函数,当myfile
超出范围时,它会负责清理资源。这是称为RAII(资源获取是初始化)的技术的一部分。
请注意,当
fstream
对象被销毁时,任何打开的文件都会自动关闭。
close
函数用于检查关闭文件(或任何其他流)是否成功,并在close
失败的情况下执行一些额外的文件系统清理。
我在linux中使用了memcheck和valgrind来检查程序,没有发现内存泄漏。
这表明您的程序不会产生内存泄漏。
答案 3 :(得分:2)
如果您没有明确调用close
,则当对象超出范围时,文件将被关闭。因此没有内存或其他资源泄漏的危险。
您可能需要明确调用close
以检查文件是否正确关闭。在许多情况下,文件只有在关闭时才会写入,因此在关闭后检查流状态可能很重要。