8. 堆,栈与内存管理
约 430 字大约 1 分钟
2025-09-05
8.1 所谓stack (栈), 所谓 heap (堆)
普通变量存放于栈区,关键字 new 开辟出的变量存放于堆区。
8.2 stack objects 的生命期
所谓stack object,其生命在作用域(scope) 結束之際結束。又稱為auto object,因為它會被「自動」清理。
8.3 static local objects 的生命期
static object,其生命在作用域(scope) 結束之後仍然存在,直到整個程序結束。
8.4 global objects 的生命期
global object,其生命在整個程序結束之後 才結束。你也可以把它視為一種static object,其作用域 是「整個程序」。
8.5 heap objects 的生命期
指针P 指向一个new创建的对象便是heap object,其生命在它被deleted之際結束。
如果當作用域結束,p所指的heap object 仍然存在,但指針p的生命卻結束了,作用域之外再也看不到p (也就沒機會delete p)
8.6 new:先分配memory, 再調用ctor
这一行代码可以分解成三个步骤:
- 分配内存,底层使用C语言的 malloc 函数实现
- 转型,void* 转成 Complex*
- 构造函数
8.7 delete:先调用dtor, 再释放memory
这一行代码可以分解成三个步骤:
- 调用析构函数
- 操作符delete释放内存,底层使用C语言的 free 函数实现
8.8 array new 一定要搭配array delete
delete [] 泄露的不是整块内存空间,而是array内部元素的析构函数只会被调用一次
详情见《Effective C++》条款16:成对使用 new 和 delete 时要采取相同形式