堆和栈的区别总结
文章目录
堆栈概述
- 对于学习缓冲区溢出,堆栈是一个不容忽视的概念,堆栈是两种数据结构。前一段时间经过对栈溢出利用的学习,明白了栈空间是在程序设计时已经规定好怎么使用,使用多少的内存空间。典型的栈变量包含函数的普通变量、数组等。栈变量在使用的时候不需要额外的申请操作,系统会根据函数中的变量声明自动在函数栈帧中给其预留空间。
- 对于堆而言,它具备以下特性:
- 堆是一种在程序运行时动态分配的内存。
- 堆在使用时需要程序员专用函数进行申请,如C语言中的malloc函数、C++中的new函数等。
- 一般用一个堆指针来使用申请得到的内存,读、写、释放都通过这个指针来完成。
- 使用完毕后需要把堆指针传给堆释放函数回收这片内存,否则会造成内存泄露。典型的释放函数包括free、delete等。
堆内存和栈内存的比较
类型 | 堆内存 | 栈内存 |
---|---|---|
典型用例 | 动态增长的链表等数据结构哦 | 函数局部数组 |
申请方式 | 需要用函数申请,通过返回的指针使用,如p=malloc(8); | 在程序中直接申明即可,如char buffer[8]; |
释放方式 | 需要把指针传给专用的释放函数,如free | 函数返回时由系统自动回收 |
管理方式 | 需要程序员处理申请和释放 | 申请后直接使用,申请与释放由系统自动完成,最后达到栈区平衡 |
所处位置 | 变化范围很大 | 0x0012xxxx |
增长方向 | 由内存低地址向高地址排列 | 由内存高地址向低地址增加 |