我理解的堆栈(stack)、动态内存分配与堆(heap)

本文通过分析VS2010中的反汇编代码,探讨堆栈(stack)的工作原理,强调其顺序分配和定长特性,以及动态内存分配(heap)的随机分配和内存回收机制。通过对程序运行时内存分配的跟踪,帮助读者深入理解这两种内存管理方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                   看到第4章,首次接触到堆(heap)这个概念,不好理解,所以用vs2010反汇编跟踪下程序:

// use_new.cpp -- using the new operator
#include <iostream>
int main()
{
	using namespace std;
	int nights = 65535;
	int * ni = &nights;
	int * pt = new int;		
// new运算符为程序动态分配内存(程序运行时进行的),类似于C语言中的malloc函数
	*pt = 65535;

	cout << "int nights value = " << nights	// 从堆栈(stack)中取得数据65535
		<< ": location = " << &nights << endl;
	cout << "int* ni value = " << *ni		
// 从堆栈(stack)中取得ni值(地址[ni]),依照此(地址)在堆栈(stack)从寻找*ni中的数据65535
		<< ": location = " << ni << endl;
	cout << "int* pt value = " << *pt		
// 从堆栈(stack)中取得pt值(地址[pt]),依照此(地址)在堆(heap)从寻找*pt中的数据65535
		<< ": location = " << pt << endl;

	double * pd = new double;
	*pd = 10000001.0;
	
	cout << "double* pd value = " << *pd
		<< ": location = " << pd << endl;
	cout << "location of pointer pt: " << &pt
		<< "; location of pointer pd: " << &pd << endl;
	cout << "size of pt = " << sizeof(pt)
		<< "; size of *pt = " << sizeof(*pt) << endl;
	cout << "size of pd = " << sizeof(pd)
		<< "; size of *pd = " << sizeof(*pd) << endl;
	delete pt;		
// 与new运算符成对出现,释放new分配的内存空间。
	delete pd;		
// 如果不用delete运算符,将发生内存泄露(被分配的内存再也无法使用了)
	return 0;
}

1. 动态内存分配是指在程序运行时为程序中的变量分配内存空间,它完全由应用程序自己进行内存的分配和回收;

2. 变量nights、pt、pd的值都存储在被称为栈(stack)的内存区域中,这种存储数据方式便是“自动存储”;而new从被称为堆(heap)或自由存储区(free store)的内存池中分配内存,该内存池同静态变量与自动变量的内存是分开的,这种存储方式为“动态存储”;

3. Stack的内存管理是顺序分配的,而且定长,不存在内存回收问题;而Heap 则是随机分配内存,不定长度,存在内存分配和回收的问题;

跟踪如下:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值