C++ C++;静态阵列导致内存泄漏?

C++ C++;静态阵列导致内存泄漏?,c++,memory,arrays,memory-leaks,C++,Memory,Arrays,Memory Leaks,让我们假设我有一些像 void foo() { char c[100]; printf("this function does nothing useful"); } 调用foo时,它会在堆栈上创建数组,当它超出范围时,内存是否会自动释放?或者c被破坏了,但是内存仍然被分配,除了重新启动计算机之外,没有办法访问/获取它 内存是否自动释放 对。如果你想知道的话,析构函数也会被调用。这就是为什么他们被关在监狱里 (实际上,对于大多数架构,程序只会调用100个析构函数(如果有的话),

让我们假设我有一些像

void foo()
{
    char c[100];
    printf("this function does nothing useful");
}
调用foo时,它会在堆栈上创建数组,当它超出范围时,内存是否会自动释放?或者c被破坏了,但是内存仍然被分配,除了重新启动计算机之外,没有办法访问/获取它

内存是否自动释放

对。如果你想知道的话,析构函数也会被调用。这就是为什么他们被关在监狱里


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

它消失了-全部消失了


但内存可立即供下一个函数使用。堆栈只是作为一个指针实现的,当您执行c[100]时,它会将指针向下移动100字节,以便下一个请求的内存位于c之后。当您离开函数时,堆栈指针只是向上移动到您进入函数之前的上一个位置。与new/delete/malloc相比,这是一种非常快速有效的内存管理方法。在这种情况下,是的,内存被释放。如果你做过类似的事情:

int var = 100;
char* c = new char[var];
那么,一旦函数结束,它将保留下来


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

很清楚,这里实际上没有内存分配;正在进行堆栈分配。这种差异是显著的,因为前者需要函数调用、从分配系统中保留内存和大量开销。相反,后者只涉及增加堆栈指针。堆栈分配总是要快得多,并且,除了涉及堆栈损坏的bug之外,总是在函数退出时清除。

Ok。谢谢大家的回复。我肯定会使用new/delete,但有人给我的印象是,我发布的内容不会被释放。如果一个指针被删除(当它超出范围时),但它指向的数据仍处于分配状态(也无法访问),您如何结束这种情况?@MDonovin:请参阅mmr的答案。这不是一个静态数组。它只是一个本地(堆栈分配)数组。