堆和栈的区别

来源:互联网 发布:淘宝网耐克运动鞋 编辑:程序博客网 时间:2024/04/27 06:14

刚才在工作中分析了同事询问的一个关于堆和栈的问题,这样的问题确实很复杂,本来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++细节复杂,博大精深!


0 0
原创粉丝点击