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)