假设我有这样的东西...
void foo()
{
char c[100];
printf("this function does nothing useful");
}
当调用foo函数时,它会在堆栈上创建一个数组,当它超出作用域时,内存是否自动释放?或者c被销毁了,但内存仍然保持分配状态,除非重新启动计算机,否则无法访问它/获取它?
假设我有这样的东西...
void foo()
{
char c[100];
printf("this function does nothing useful");
}
内存会自动释放吗?
是的。如果你想知道,析构函数也会被调用。这就是为什么它们在自动
存储类中的原因。
(实际上,对于大多数架构,程序只会调用那100个析构函数(如果有的话),然后将栈指针向后移动100 * sizeof(T)
字节作为“释放”.)
int var = 100;
char* c = new char[var];
这样一来,在函数结束后,它就会留下。
但是!在现代操作系统中,您无需重新启动即可恢复丢失的内存。相反,内存将在进程(程序)结束时返回。
明确地说,这里并没有进行内存分配; 这里进行了堆栈分配。这种区别非常重要,因为前者需要函数调用,从分配系统中保留内存以及大量的开销。相比之下,后者只涉及增加堆栈指针。堆栈分配总是更快,除了涉及堆栈破坏的错误情况外,在函数退出时始终清理。
它消失了 - 全部都消失了。
但是内存可以立即供下一个函数使用。栈只是作为指针实现的,当您执行c[100]时,它将指针向下移动100个字节,因此请求的下一个内存位于c之后。当您离开函数时,堆栈指针只是回到进入函数之前的上一个位置。与new/delete/malloc相比,这是一种非常快速和高效的内存管理方式。