C/C++堆和栈的区别

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;
}

猜你喜欢

转载自blog.csdn.net/qq_34304107/article/details/80021670