这里写得很简洁,实际上堆的机制比较复杂,我详细地学习了 Windows 下的堆管理机制,如果对这部分感兴趣的话,可以参考我的另一篇文章:https://www.cnblogs.com/XiuzhuKirakira/p/16986744.html
栈和堆的区别
1)生命周期
栈:生命周期在被调用函数内,不调用函数就不生成栈
堆:生命周期由程序员决定,new出现,delete消亡
2)初始化
栈在内存中被初始化为: 0xcccccccc
堆在内存中被初始化为: 0xcdcdcdcd (也没有这么绝对,此处的堆特指使用 new 申请的内存块,且为 Debug 状态)
对于堆(heap),若 int *v1 = new int[2]; 则在内存空间中应是:
0xFDFDFDFD
0xCDCDCDCD
0xCDCDCDCD
0xFDFDFDFD
注意:
一个进程可以有若干栈[][][][],但是只有一个堆[ [] [] ] 即进程默认堆
栈数组和堆数组的区别
1)栈数组的内存在栈上,而堆数组需要从栈数组上的一个内存去访问堆上的内存
如下:
int v1[] = { 1,20,3,-1 };//16个字节
int *v2 = new int[4];//栈上4/8个字节,堆上16个字节
2)地址分布
低地址
栈 ebp esp
堆
代码段 .txt
数据段 .data .rdata
高地址
3)栈数组数组名不能被修改,堆数组名可以
int v1[] = { 1,20,3,-1 };//栈上16个字节
int *v2 = new int[4];//栈上4/8个字节(在栈上只是一个指针,在 x86 系统下指针字节为 4,在 x64 系统下指针字节为 8),堆上16个字节
int i = 0;
for (i = 0; i < 4; i++)
{
*v2 = v1[i];
v2++;//改变不会报错,但如果后面不改回去,delete程序就会崩溃
}
v2--;
v2--;
v2--;
v2--;
if (v2 != NULL)
{
delete v2;
}
4)对于栈,堆数组使用sizeof,结果不一样
cout << sizeof(v1) << endl;//输出16
cout << sizeof(v2);//输出4或8
5)堆相对于栈而言,更利于用户的友好界面
_tprintf(_T("How Many\r\n"));
int count = 0;
int*v3;
_tscanf_s(_T("%d"), &count);
if (count == 0 || count > 10)
{
return;
}
else
{
v3 = new int[count];
}
标签:count,字节,以及,int,区别,v2,数组,new
From: https://www.cnblogs.com/XiuzhuKirakira/p/17052503.html