¶C++ stack与heap
stack(栈) heap(堆)
Stack,是存在于某作用域(scope)的一块内存空间(memory space).例如当你调用函数,函数本身即会形成一个stack用来放置它所接收的参数,以及返回地址。
在函数本身(function body)内声明的任何变量,其所使用的内存块都取自于上述stack.
Heap,或者说system heap,是指由操作系统提供的一块global内存空间,程序可动态分配(dynamic allocated)从中获得若干区块(blocks)
1 | class Complex {...}; |
stack objects 的生命周期
1 | class Complex{...}; |
c1便是所谓stack object,其生命在作用域(scope)结束时结束。
这种作用域内的object,又称为auto object,因为它会被自动释放。
static local objects 的生命周期
1 | class Complex{...}; |
c2便是所谓static object,其生命在作用域(scope)结束时仍然存在,直到整个程序结束.
1 | class Complex{...}; |
c3就是global object,其生命在整个程序结束之后才结束,也可以把它视为一种static object,其作用域是整个程序.
heap objects 的生命周期
1 | class Complex{...}; |
p所指的是heap object,其生命在它被deleted时结束。
class Complex{...}; ...{
* p = new Complex;
Complex
}
以上出现内存泄露(memory leak),因为当作用域结束,p所指的heap object仍然存在,但指针
p的生命却结束了,作用域之外再也看不到p(也就没机会delete p)了。
尽可能避免这种情况。
new:先分配memory,再调用ctor
Complex * pc = new Complex(1,2);
三个步骤。
编译器转化为:
1 | Complex * pc; |
delete: 先调用 dtor,再释放memory
1 | String * ps = new String("Hello"); |
1 | String::~String(ps); //析构函数 |
array new 一定要搭配 array delete
1 | String * p = new String[3]; |