让我说我有类似......
void foo()
{
char c[100];
printf("this function does nothing useful");
}
当调用foo时,它会在堆栈上创建数组,当它超出范围时,是否会自动释放内存?或者是c被破坏了,但是内存仍然被分配,除了重新启动计算机之外无法访问它/取回它?
答案 0 :(得分:6)
是自动解除分配的内存吗?
是。如果你想知道的话,也会调用析构函数。这就是为什么他们在auto
matic 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
相比,这是一种非常快速有效的内存管理方式