堆和栈的区别

刚才在工作中分析了同事询问的一个关于堆和栈的问题,这样的问题确实很复杂,本来c++细节就多,今后需要更加完善及注意,简单总结如下:


堆和栈,针对的只是变量的存储位置,而不是针对函数,函数有函数的存放位置;


如何判断变量(准确的说是变量内存)是在堆,还是在栈上?


几个准则吧:


(1)全局变量(初始化和未初始化)、静态变量是在全局区,而不是在栈或堆上;


(2)是在编译时期确定存储位置(栈上),还是在运行时期确定存储位置(堆上)?

new malloc分配的都是在堆上,其他是在栈上;局部变量在栈上;


(3)int main(int argc, char *argv[])

{

A a; // 局部变量,非new,在编译时由编译器通过构造函数确定位置,不能动态调用函数, 在栈上分配内部变量的内存空间

A *b = new A();// A具有默认构造函数的类,b指针本身是局部变量,在栈上; 但是经过operator new()操作分配的对象内存(成员变量)在堆上

}


(4)STL容器中的元素是通过allocator malloc分配的,在堆上;所以即便STL容器变量在对象内存中处于栈上时,容器中的元素也是在堆上;


(5)placement new()操作重载后,可以将内存附着在指定栈内存上;当然,也可以定义A对象只能分配在堆或者栈上,只要限制构造函数或者析构函数


的访问权限,并修改释放功能即可


总计,c++细节复杂,博大精深!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seasermy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值