C ++静态数组导致内存泄漏?

时间:2010-05-03 15:01:21

标签: c++ memory arrays memory-leaks

让我说我有类似......

void foo()
{
    char c[100];
    printf("this function does nothing useful");
}

当调用foo时,它会在堆栈上创建数组,当它超出范围时,是否会自动释放内存?或者是c被破坏了,但是内存仍然被分配,除了重新启动计算机之外无法访问它/取回它?

4 个答案:

答案 0 :(得分:6)

  

是自动解除分配的内存吗?

是。如果你想知道的话,也会调用析构函数。这就是为什么他们在automatic storage class

(实际上对于大多数架构,程序只会调用那100个析构函数(如果有的话),然后将堆栈指针向后移动100 * sizeof(T)个字节作为“deallocation”。)

答案 1 :(得分:4)

在这种情况下,是的,内存被释放。如果你做过类似的事情:

int var = 100;
char* c = new char[var];

一旦功能结束,那将会留下。

然而!您无需重新启动即可在现代操作系统上恢复丢失的内存。相反,一旦进程(程序)结束,就会返回内存。

答案 2 :(得分:3)

要明确的是,这里没有真正的内存分配;发生了堆栈分配。差别很大,因为前者需要函数调用,从分配系统中保留内存,以及大量开销。相反,后者只涉及递增堆栈指针。堆栈分配总是快得多,除非涉及堆栈损坏的错误,否则在函数退出时总是会被清除。

答案 3 :(得分:0)

它消失了 - 一切都消失了。

但是内存可以立即供下一个功能使用。堆栈只是作为指针实现,当你执行c [100]时,它将指针向下移动100字节,因此请求的下一个内存在c之后。当您离开该功能时,堆栈指针只会在您进入该功能之前向后移动到之前的位置。与new / delete / malloc

相比,这是一种非常快速有效的内存管理方式