stack object

class Complex{...};

...

{

Complex c1(1, 2);//stack object

statcic Complex c2(1, 2);//static object

}

Complex c3(1,2)//global object全局对象

int main(){...}

c1就是stack object,其生命在作用域结束的时候结束。这种作用域内的object又称为auto object,

因为它会被“自动”清空。

c2就是static object,其生命在作用域结束的时候仍然存在,直到程序结束。

c3就是global object,其生命在整个程序结束的时候之后才结束。可以看作是一种static object,作用域是整个程序



heap object

class Complex{...};

...

{

Complex* p = new Complex;//stack object

...

delete p;//不写就会发生内存泄漏,当作用域结束,p指向的heap object依然存在,但是指针p的生命结束

}


p就是heap object,其生命在delete之后结束。

Complex* pc = new Complex(1,2);

...

delete pc;

编译器转化为->

Complex *pc;

void* mem = operator new(sizeof(Complex));//分配内存

operator new->内部调用malloc(n)

pc = static_cast<Complex*>(mem);//转型

pc->Complex::Complex(1,2);//构造函数


class String

{

public:

     ~String()

     {delete[] m_data;}

     ...

private:

     char* m_data;    

}; 

String ps = new String("Hello");

delete pc;

编译器转化为->

Complex::~Complex(pc);//析构函数

operator delete(pc);//释放内存

operator delete(pc)->内部调用free(pc)