C/C++内存管理

来源:互联网 发布:手机拍摄软件 编辑:程序博客网 时间:2024/06/07 02:42

1、堆栈

  想要清楚分析内存管理机制,堆和栈的不可避免要讨论的问题,首先要理清数据结构中的栈和堆和内存分配中的栈和堆,他们是不一样的概念!

数据结构的栈和堆

栈就像存放数据的桶,他是一种具有后进先出性质的数据结构

堆是一种经过排序的树形数据结构,通过所说的堆的数据结构,是指二叉堆。


内存分配中的栈和堆

 (1、)概念

栈:由编译器自动分配释放,存放函数的参数值,局部变量。操作方式类似于数据结构中的栈。

堆:一般有程序员分配释放,若程序员不释放,则可能会引起内存泄漏。和数据结构中的堆栈不一样,类似于链表。


 (2、)申请大小

栈:栈的大小是固定。由系统分配。的是一块连续的内存区域,如果申请空间超过栈的剩余空间时,将会提示overflow。

堆:堆是不连续的内存区域,这是有系统使用链表来存储空闲内存地址的,自然是不连续的。堆的大小受限于计算机中有效的虚拟内存。


 (3、)分配方式

栈:有两种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配有alloca函数进行分配,但是栈的动态分配和堆是不同的,栈的动态分配由编译器实现,无需手动实现。而堆需要手动释放。

堆:都是动态分配,没有静态分配。


对于一个进程的内存空间而言,可以在逻辑上分成3个部份:代码区,静态数据区和动态数据区。

动态数据区一般就是“堆栈”。“栈(stack)”和“堆(heap)”是两种不同的动态数据区,栈是一种线性结构,堆是一种链式结构。进程的每个线程都有私有的“栈”,所以每个线程虽然代码一样,但本地变量的数据都是互不干扰。一个堆栈可以通过“基地址”和“栈顶”地址来描述。

静态数据区——全局变量和静态变量分配在静态数据区,本地变量分配在动态数据区,即堆栈中。程序通过堆栈的基地址和偏移量来访问本地变量。





 (4、)存储内容

栈:在函数调用的时候,第一个进栈的是主函数中后的下一条语句地址。然后是函数的各个参数,参数是由右往左入栈的,然后是函数的局部变量。函数调用后局部变量先出栈,然后是参数,最后栈顶指针指向最开始存的地址。也就是主函数的下一条指令,程序由该点继续执行。

堆:一般是在堆的头部用一个字节存放堆的大小。





0 0