Stack,存在于某作用域(Scope)的一块内存空间(memory space)。比如当调用函数的时候,函数本身会形成一个stack用来放置它所接受的参数,已经返回地址
Heap(SystemHeap),操作系统提供的一块global内存空间,程序可以动态分配获取其中的若干区块(block)
比如有
class Complex{...};
{
Complex c1(1,2); //c1所在内存来自于栈(stack)
Complex* p = new Complex(3); //p所占内存来自于堆(heap),new出来的对象都是来自于堆,有new,必须有delete写法
}
所以当上述{ }作用域之外的时候,c1(位于栈的内存)即自动消失,而位于堆中的内存不会自己消失
但是如果是{ static Complex c2(1,2);}在作用域之外仍然存在,一直到程序结束才会结束
New的步骤
先分配memory,再调用ctor,比如针对这样new一个类
Complex* pc = new Complex(1,2);
内部的步骤如下:
①void* mem = operator new(sizeof(Complex));//分配内存
②pc = static_cast<Complex*>(mem);//转型
③pc->Complex::Complex(1,2);//调用构造函数
Delete的步骤
先调用dtor,再释放memory
String* ps = new String("hello");
delete pc;
内部的步骤如下:
String::~String(ps);//调用析构函数,
operator delete(ps);//释放内存