刚开始学习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关键字删除指针指向的对象,如果程序崩溃,说明不能删除,对象是存储在栈中的。反之对象是存储在堆中。为什么会这样,因为栈的释放是不能由我们控制的,是自动释放,人为干涉就会使程序崩溃。
刚刚开始学习,不知道理解的对不对,希望大家指正