【发布时间】:2011-12-22 22:47:09
【问题描述】:
我是 C++ 新手,我想知道以下代码是否容易出现内存泄漏。
在这里,我使用std::ostream 指针将输出重定向到控制台或文件。
为此,我为std::ofstream 调用新操作员。
#include <iostream>
#include <fstream>
int main() {
bool bDump;
std::cout << "bDump bool" << std::endl;
std::cin >> bDump;
std::ostream *osPtr;
if (bDump) {
osPtr = new std::ofstream("dump.txt");
} else {
osPtr = &std::cout;
}
*osPtr << "hello";
return 0;
}
还有一件事,我没有关闭在为ofstream 调用构造函数时打开的文件。我们这里是否有任何潜在的数据丢失情况。因为文件没有关闭。
【问题讨论】:
-
内存泄漏不会发生在主函数中,除非你有类似 for/while 的东西。
-
@Radu:这取决于你对内存泄漏的定义,不是吗?
-
我相信这在技术上是未定义的行为:3.8 [basic.life]/4 “对于具有非平凡析构函数的类类型的对象,......如果不使用删除表达式为了释放存储,不应隐式调用析构函数,并且任何依赖于析构函数产生的副作用的程序都有未定义的行为。”因此,按照标准的规定,当
main结束时,如果bDump是true,则该程序可能会向操作系统请求一些共享内存,然后突然结束,使其永远不会被回收,从而导致实际的永久内存泄漏。 -
@DennisZickefoose:如果它依赖于析构函数产生的副作用,那么它具有未定义的行为是正确的。但事实并非如此。如果析构函数向操作系统释放了一些这样的资源,那么它就会发生内存泄漏是正确的。但事实并非如此。 (所以,不,它没有内存泄漏。不,它没有未定义的行为。是的,这种类型的代码容易发生内存泄漏。)
-
@David:假设
bdump是true:如果调用析构函数,文件“dump.txt”将包含文本“hello”。如果不调用析构函数,文件“dump.txt”将不包含文本“hello”。我同意你的观点,一般来说,像这样的泄漏在现代系统上不是问题。但只有如果有问题的对象有一个微不足道的析构函数...ofstream不符合条件。