【发布时间】:2015-05-04 04:37:18
【问题描述】:
假设你有以下函数:
void doSomething(){
int *data = new int[100];
}
为什么会产生内存泄漏?既然不能在函数外访问这个变量,为什么每次调用这个函数结束时编译器都不会自己调用delete呢?
【问题讨论】:
-
你说“变量”,编译器确实删除了这里的“变量”,但他没有删除它指向的内存,因为这就是堆的实际用途,至少部分是这样,否则您必须在取消分配之前验证没有指向该内存,这就是“垃圾收集器”的用途
-
你是对的,但我还是不明白为什么内存没有自动释放。
-
您正在寻找garbage collection。 Java 这样做(或多或少)。 C++ 只是做不同的事情,有它自己的优点和缺点。
-
@jsguy:理论上可以。 C++11 中的一些更改是为了至少可以创建一个包含垃圾收集器的符合要求的实现。事实上,这不会发生,因为大多数 C++ 程序员不愿意忍受添加垃圾收集器所涉及的权衡。但是,如果您非常想的话,您可以add on a garbage collector。
-
还请记住,作者可能不希望将其释放。不是因为他想重用内存,而是因为他知道该函数不会被足够多地调用,以至于它导致的内存泄漏实际上会导致问题,并且他不希望运行时间浪费在释放上。可以肯定的是,他可能是一个非常糟糕的程序员,但 C++ 的核心原则之一是你不用为不用的东西付费。
标签: c++ memory memory-leaks