【Exceptional C++(19)】内存管理(一)
作者:
downdemo | 来源:发表于
2018-01-30 12:19 被阅读11次
- C++有几个不同的内存区域,用来存储对象或其他类型的值,每一个区域有其各自的特点
常量数据区(const data)
- 存储字符串等在编译期间就能确定的值
- 类对象不能存在于这个区域中
- 在程序整个生命周期,区域中的数据都是可用的
- 区域中所有数据都是只读的,任何修改本区数据的行为都会造成无法预料的后果
栈区(stack)
- 存储自动变量
- 分配操作比heap或free store快,因为stack的分配只涉及一个指针的递增
- 内存一旦分配对象就构造好了,对象一旦销毁分配的内存也立即收回
- 程序员无法直接操控已被分配但未初始化的stack空间
自由存储区(free store)
- C++的两个动态内存区域之一,用new和delete分配和释放
- 对象的生存周期可以比存放它的内存区的生存周期短,可以获得一片内存区而不用马上初始化,对象销毁后也不用马上收回其占用的内存区
- 对象被销毁而内存区未被收回的期间可以通过void*指针访问这片区域,但其原始对象的非静态成员以及成员函数(即使知道地址)都不能被访问或操控
堆区(heap)
- 另一个动态存储区域,使用malloc、free及一些相关变量进行分配和回收
- 虽然特定编译器中缺省的全局运算符new和delete会按malloc和free的方式实现,但是heap与free store是不同的,在某一个区域内被分配的内存不可能在另一个区域内被安全回收
- heap中被分配的内存一般用于存放在使用new的构造过程中和显式析构过程中涉及到的类对象
- heap中对象的生存周期与free store中的类似
全局/静态区(Global/Static)
- 内存区域在程序启动时才被分配,可能直到程序运行时才初始化,比如函数静态变量在程序第一次执行到定义该变量的代码时才被初始化
- 对跨越了编译单元的全局变量进行初始化操作的顺序没有明确定义
- 没有初始化的对象存储区域可以通过void*来访问和操控,但在对象的生存周期之外非静态成员和成员函数无法被使用或引用
本文标题:【Exceptional C++(19)】内存管理(一)
本文链接:https://www.haomeiwen.com/subject/mqzqzxtx.html
网友评论