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