C++中栈和堆的区别及区分对象存储在堆或栈中的方法
2016-10-20 11:19
405 查看
刚开始学习C++,记录下点点滴滴,同时也分享下
栈:
函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。
堆:
又称为动态内存分配,程序在运行的时候用new申请任意多少的内存,由程序员自己负责在何时用delete释放内存。动态内存的生存周期由我们决定,使用灵活,但是问题也比较多。
刚开始学习C++,感觉会有很多人和我一样,可能明白堆和栈的区别,也能明白简单情况下对象是存储在堆中还是栈中,复杂的就有可能分不清了。
网上没有查到直接获取对象存储在堆中还是栈中的方法,下面提供一个思路,供大家参考
输出结果是
我们通过存储的地址来判断对象存储在堆还是栈上,理论依据是:堆是向高地址位扩展,而栈是向低地址位扩展。
指针i指向的对象地址要低于j指向的地址,是向高地址位扩展,所以指针i,j指向的对象存储在堆中。而a,b的地址可以看出,是向低地址位扩展,所以a,b是存储在栈中。
细心的朋友可以发现,我代码中有用到了delete i,这里也是有用的,因为这是第2种判断对象存储位置的方法。指针只能指向堆中对象,不能指向栈中对象,可以用指针指向要判断的对象,然后用delete关键字删除指针指向的对象,如果程序崩溃,说明不能删除,对象是存储在栈中的。反之对象是存储在堆中。为什么会这样,因为栈的释放是不能由我们控制的,是自动释放,人为干涉就会使程序崩溃。
刚刚开始学习,不知道理解的对不对,希望大家指正
栈:
函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。
堆:
又称为动态内存分配,程序在运行的时候用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关键字删除指针指向的对象,如果程序崩溃,说明不能删除,对象是存储在栈中的。反之对象是存储在堆中。为什么会这样,因为栈的释放是不能由我们控制的,是自动释放,人为干涉就会使程序崩溃。
刚刚开始学习,不知道理解的对不对,希望大家指正
相关文章推荐
- C++中创建对象的两种方法及其区别
- c++中cin对象中getline()方法和get()方法的区分
- javascript对象和c++对象的区别-----坑爹的js,痛苦的语法特性,使用方法
- 二.OC基础--1,对象的存储细节,2,#pragma mark指令,3,函数和对象方法的区别,4,对象和方法之间的关系 ,5.课堂习题
- C++三种创建对象的方法区别
- C++之三种创建对象方法的区别
- Effective Modern C++ Item 7 总结:关于两种对象创建方法“()、{}”的区分
- 类方法 和 对象方法(实例方法) 区别的误区
- C++对象模型和虚函数表分析以及重载、重写、隐藏的区别
- c++中构造函数初始化的方法以及主要区别
- iOS对象方法和类方法的区别与调用方式
- 块存储、文件存储及对象存储区别
- js判断对象类型 typeof与Object.prototype.toString.call方法的区别
- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢 是用==还是equals() 它们有何区别
- C++中定义对象的语法,带括号与不带括号有什么区别?
- JQuery this和$(this)的区别及获取$(this)子元素对象的方法
- C++返回对象和引用的区别
- OC 对象的内存存储细节(类方法及对象方法的调用细节)
- Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?
- c++/java中类和对象的区别