C++中栈和堆的区别及区分对象存储在堆或栈中的方法

  • Post author:
  • Post category:其他


刚开始学习C++,记录下点点滴滴,同时也分享下

栈:

函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。

堆:

又称为动态内存分配,程序在运行的时候用new申请任意多少的内存,由程序员自己负责在何时用delete释放内存。动态内存的生存周期由我们决定,使用灵活,但是问题也比较多。

刚开始学习C++,感觉会有很多人和我一样,可能明白堆和栈的区别,也能明白简单情况下对象是存储在堆中还是栈中,复杂的就有可能分不清了。

网上没有查到直接获取对象存储在堆中还是栈中的方法,下面提供一个思路,供大家参考

int main()
{
	int *i = new int(5);
	int *j = new int(6);
	int a = 5;
	int b = 6;
	cout << "i指向的地址:"<<i << endl;
	cout << "j指向的地址:"<<j << endl;
	cout << "a的地址:"<<&a << endl;
	cout << "b的地址:"<<&b << endl;
	
	delete i;
	return 0;
}

输出结果是


我们通过存储的地址来判断对象存储在堆还是栈上,理论依据是:堆是向高地址位扩展,而栈是向低地址位扩展。

指针i指向的对象地址要低于j指向的地址,是向高地址位扩展,所以指针i,j指向的对象存储在堆中。而a,b的地址可以看出,是向低地址位扩展,所以a,b是存储在栈中。

细心的朋友可以发现,我代码中有用到了delete i,这里也是有用的,因为这是第2种判断对象存储位置的方法。指针只能指向堆中对象,不能指向栈中对象,可以用指针指向要判断的对象,然后用delete关键字删除指针指向的对象,如果程序崩溃,说明不能删除,对象是存储在栈中的。反之对象是存储在堆中。为什么会这样,因为栈的释放是不能由我们控制的,是自动释放,人为干涉就会使程序崩溃。

刚刚开始学习,不知道理解的对不对,希望大家指正



版权声明:本文为xiaoruanzhu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。