c++相关技术积累文档
文章目录
1.stack(栈)、heap(堆)
Stack,是存在于某作用域(scope)的一块内存空间(memory space)。例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。
在函数本体(function body)内声明的任何变量,其所使用的内存块都取自上述stack。
Heap,或谓system heap,是指由操作系统提供的一块global内存空间,程序可动态分配(dynamic allocated)从某种获得若干区块(blocks)。
class Complex {...};
...
{
Complex c1(1,2); //c1所占用的控件来自stack
Complex* p = new Complex(3); //Complex(3)是个临时对象,其所占用的空间乃是以new自heap动态分配而得,并由p指向
}
1.1 stack objects的生命周期
class Complex {...};
...
{
Complex c1(1,2);
}
c1便是所谓stack object,其生命在作用域(scope)结束之际结束。这种作用域内的object,又称为auto object,因为它会被自动清理,即它的析构函数会被自动地调用起来。
1.2 static local objects的生命周期
class Complex {...}
...
{
static Complex c2(1,2);
}
c2即所谓static object,其生命在作用域(scope)结束之后仍然存在,直到整个程序结束。
1.3 global objects的生命周期
Complex c3(1,2);
int main()
{
...
}
c3便是所谓global object,其生命在这个程序结束之后才结束。你也可以把它视为一种static object,其作用域是整个程序。
1.4 heap objects的生命周期
class Complex {...};
...
{
Complex* p = new Complex;
...
delete p;
}
p所指的便是heap object,其生命在它被deleted之际结束。
class Complex {...};
...
{
Complex* p = new Complex;
}
以上出现内存泄漏(memory leak)因为当作用域结束,p所指向的heap object仍然存在,单指针p的生命周期结束了,作用域之外再也看不到p(也就没机会delete p)。
2.new、delete
new :先分配memory,再调用构造函数ctor。
delete :先调用析构函数dtor,再释放memory。
array new 一定要搭配 array delete