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

5

假设我有这样的东西...

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

当调用foo函数时,它会在堆栈上创建一个数组,当它超出作用域时,内存是否自动释放?或者c被销毁了,但内存仍然保持分配状态,除非重新启动计算机,否则无法访问它/获取它?

这不是一个静态数组。它只是一个本地(堆栈分配)数组。 - John Dibling
4个回答

6

内存会自动释放吗?

是的。如果你想知道,析构函数也会被调用。这就是为什么它们在自动存储类中的原因。

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


好的。谢谢所有回复的人。我确信使用new/delete,但有人给我留下了这样的印象:我发布的内容不会被释放。当指针被删除(超出作用域)时,它所指向的数据仍然被分配(也无法访问),你是如何陷入这种情况的? - MDonovin
@MDonovin:请看 mmr 的答案 https://dev59.com/qk3Sa4cB1Zd3GeqPwI95#2758985。 - kennytm

4
在这种情况下,是的,内存将被释放。如果您做了像这样的事情:
int var = 100;
char* c = new char[var];

这样一来,在函数结束后,它就会留下。

但是!在现代操作系统中,您无需重新启动即可恢复丢失的内存。相反,内存将在进程(程序)结束时返回。


3

明确地说,这里并没有进行内存分配; 这里进行了堆栈分配。这种区别非常重要,因为前者需要函数调用,从分配系统中保留内存以及大量的开销。相比之下,后者只涉及增加堆栈指针。堆栈分配总是更快,除了涉及堆栈破坏的错误情况外,在函数退出时始终清理。


0

它消失了 - 全部都消失了。

但是内存可以立即供下一个函数使用。栈只是作为指针实现的,当您执行c[100]时,它将指针向下移动100个字节,因此请求的下一个内存位于c之后。当您离开函数时,堆栈指针只是回到进入函数之前的上一个位置。与new/delete/malloc相比,这是一种非常快速和高效的内存管理方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接