C ++ - 在函数内声明数组

时间:2012-02-02 23:30:00

标签: c++ memory

如果我在函数内声明一个数组,那么在离开函数时是否释放了内存?

我不会这么想,但是,当我在函数内声明一个数组时,将指向数组的指针写入全局变量然后尝试(在函数外部)取消引用指向数组中元素的指针,我得到了内存访问冲突。如果我在函数中使用相同的代码,我不会得到内存访问冲突。

非常感谢澄清。

提前致谢。

2 个答案:

答案 0 :(得分:4)

函数退出后将删除所有自动变量,包括数组。这通常是所有非静态局部变量。

答案 1 :(得分:2)

在函数中声明的数组在程序堆栈上分配。当程序退出函数时,将弹出堆栈上的局部变量,并且不再可以访问包含该数组的内存。另一种方法是 new 一个在程序堆上分配的数组指针,它将在函数退出后继续运行,并且必须随后 delete 'd或发生内存泄漏。< / p>

对程序堆栈的一个相当一般的解释是留出一块存储器来保存函数的局部变量。调用函数时,保存函数局部变量所需的内存量将被压入堆栈顶部,即堆栈指针向上移动该量。当函数退出时,从堆栈顶部弹出确切的内存量,堆栈指针在函数调用之前向下移动到其先前的位置。另一方面,程序堆是没有堆栈语义的内存,在函数请求 new 内存块时使用。然后该程序负责管理该内存的重新分配。

Smart pointers通常在C ++中用于自动处理内存的分配和释放,以避免与内存管理相关的错误/内存泄漏。

快速谷歌崛起this explanation of stack versus heap in C++