您的位置:首页 > 编程语言 > C语言/C++

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

2016-10-20 11:19 405 查看
刚开始学习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关键字删除指针指向的对象,如果程序崩溃,说明不能删除,对象是存储在栈中的。反之对象是存储在堆中。为什么会这样,因为栈的释放是不能由我们控制的,是自动释放,人为干涉就会使程序崩溃。

刚刚开始学习,不知道理解的对不对,希望大家指正
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: