忘记调用std :: ofstream关闭函数会导致内存泄漏吗?

时间:2014-07-31 10:00:29

标签: c++ memory-leaks

我只是对这个问题感到好奇:忘记调用std :: ofstream关闭函数会导致内存泄漏吗?我举了下面的例子来说明我的问题:

using namespace std;
ofstream myfile;
myfile.open ("C:\\report.html");
myfile << "<html lang=\"en\"> " << endl;
myfile << "<head>" << endl;

Normallly,我们也应该在代码脚本的末尾调用myfile.close()。但是,如果我忘了调用关闭功能,会发生什么?它会导致内存泄漏吗?我在linux中使用了memcheckvalgrind来检查程序,并且没有找到内存泄漏。那么如果没有调用close函数会有什么副作用。

4 个答案:

答案 0 :(得分:5)

当您的std::ofstream对象超出范围时,由于使用RAII并自动调用对象析构函数,它将自动关闭。

在这种情况下,您的代码是完全可以接受的,并且不会导致内存泄漏。根本不需要手动关闭。

如果您希望在超出范围之前重用该对象,则仅使用close,即如果ofstream对象是类的成员并且您希望重新使用它,则可以调用{{1}在它上面,然后用另一个文件等重新打开它。

答案 1 :(得分:3)

没有。当ofstream超出范围时,它将被销毁,关闭它。

想象一下,如果在允许容器超出范围之前必须确保每个ofstream,请使用容满close的容器是多么困难。

答案 2 :(得分:2)

  

忘记调用std :: ofstream关闭函数会导致内存泄漏吗?

不在你的情况下:ofstream有一个析构函数,当myfile超出范围时,它会负责清理资源。这是称为RAII(资源获取是初始化)的技术的一部分。

来自documentation

  

请注意,当fstream对象被销毁时,任何打开的文件都会自动关闭。

close函数用于检查关闭文件(或任何其他流)是否成功,并在close失败的情况下执行一些额外的文件系统清理。

  

我在linux中使用了memcheck和valgrind来检查程序,没有发现内存泄漏。

这表明您的程序不会产生内存泄漏。

答案 3 :(得分:2)

如果您没有明确调用close,则当对象超出范围时,文件将被关闭。因此没有内存或其他资源泄漏的危险。

您可能需要明确调用close以检查文件是否正确关闭。在许多情况下,文件只有在关闭时才会写入,因此在关闭后检查流状态可能很重要。