C++ 忘记调用std::of stream close函数会导致内存泄漏吗?

C++ 忘记调用std::of stream close函数会导致内存泄漏吗?,c++,memory-leaks,C++,Memory Leaks,我只是好奇这个问题:忘记调用std::ofstreamclose函数会导致内存泄漏吗?我举以下例子来说明我的问题: using namespace std; ofstream myfile; myfile.open ("C:\\report.html"); myfile << "<html lang=\"en\"> " << endl; myfile << "<head>" << endl; 使用名称空间std; 流文件;

我只是好奇这个问题:忘记调用std::ofstreamclose函数会导致内存泄漏吗?我举以下例子来说明我的问题:

using namespace std;
ofstream myfile;
myfile.open ("C:\\report.html");
myfile << "<html lang=\"en\"> " << endl;
myfile << "<head>" << endl;
使用名称空间std;
流文件;
myfile.open(“C:\\report.html”);

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

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


如果您希望在对象超出范围之前重用该对象,即如果ofstream对象是类的成员,并且您希望重用它,则可以对其调用
close
,然后使用其他文件重新打开该对象,等等,则仅使用
close

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

想象一下,如果您必须确保在允许容器超出范围之前关闭每个容器,那么使用一个装满
of stream
s的容器会有多么困难

忘记调用std::of stream close函数会导致内存泄漏吗

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

从:

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

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

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


这是一个非常可靠的指示,表明您的程序没有产生内存泄漏。

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


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

“请注意,当ofstream对象被销毁时,任何打开的文件都会自动关闭。”析构函数的全部意义在于,您无需手动执行此类操作。谢谢,但在哪种情况下调用关闭函数是强制性的?仅当您希望在对象超出范围之前重用该对象时,即如果ofstream对象是某个类的成员,并且您希望重用该对象,则可以对其调用关闭,然后使用其他文件等重新打开它。也可能是其他场景。。。在某些系统上,文件锁定可能是
提前关闭
文件的原因,而
关闭
会强制执行
刷新
(正如上面代码中已经使用的
endl
),并且(通常是有用的)意味着您不希望在一段时间内或再次使用该文件。设计用于在各种流上运行的代码,其中fstream是其中之一,但人们可能希望尽早关闭远程网络连接、管道等,这样远程端就不会等待进一步的数据。最后一句话肯定是错误的。在正常情况下,需要显式关闭文件,并在关闭后检查状态;如果一个程序在没有通知用户的情况下留下半个已写入的文件,那么该程序就是被破坏的,唯一可以避免这种情况的方法是显式关闭,然后检查状态,并在出现错误时通知用户(并删除该文件)。(如果在堆栈展开过程中由于以前的错误而发生关闭,并且您无论如何都要删除该文件,那么当然可以让析构函数执行该操作。)@JamesKanze公平地说,有人问我在什么情况下您会使用关闭函数,而不是为了一个完整的工作示例,显然,在实际运行的项目中,检查状态等是很重要的(最初的问题不是这样),但无论如何,您都要这样做,因为如果任何关闭失败,您必须通知用户。除非您已经处于将报告给用户的错误情况,否则您必须使用显式关闭,以便在之后检查错误。不这样做是编程错误。