C/C++堆和栈的区别主要有五点
1、生命周期不同
堆:一般由程序员分配释放,若程序员不释放,则程序结束时由OS回收
栈:由编译器自动分配
2、申请方式不同
堆:程序中使用一个堆空间可以使用new关键字、malloc函数、calloc() 函数、realloc函数实现,当不需要这个堆空间时,可以使用delete关键字、free函数
栈:由系统自动分配
3、底层实现机制不同
堆:生长方向向上生长,一般通过链表进行存储空间管理,内存上可以是不连续的
栈:生长方向是向下生长(有的系统可能是向上生长),空间使用上是连续的
4、申请空间大小不同
堆:受限于计算机系统中的有效的虚拟内存,在32位系统上,其大小可以到4G
栈:在Windows下,栈的大小是固定的(是编译时就确定的常数),所以程序员不适合在函数内申请过多的栈空间,否则会导致程序栈溢出
5、内存利用率不同
堆:空间利用一般是随机的、不连续的内存空间,容易产生内存碎片
栈:由系统分配,速度较快
一个堆栈分配的具体实例:
#include <iostream>//输入输出流库
#include <string>//字符串处理库
#include <iomanip> //输出流的格式控制符库
#include <cstdlib>
using namespace std ;//释放std命名空间中的所有对象
int a=0;//全局初始化区
char *p1;//全局未初始化区
int main(void)
{
int b;//栈
char s[]='abc';// 栈
char *p2; //栈
char *p3='123456';//栈
chat *p4; //栈
static int c=0;//全局(静态)初始化区
p1=(char*)malloc(10);//在堆中分配10个字节
p2=(char*)malloc(20);//在堆中分配20个字节
p4=new char[10];//在堆中分配10个字节,并把首地址放在p4栈中
strcpy(p1,'abcdefg');//把“abcdefg\0”放在常量区
//以下几种释放空间的方式是相同的
free(p1);
//由于p3指向的空间不是堆空间,所以不能人为释放,这将会导致错误
// free(p3);
delete p2;
delete[]p4;
return 0;
}