动态内存和智能指针
内存和智能指针简介
- 静态内存用于保存局部
static
对象、类中static
数据成员、定义在函数外的变量 - 栈内存用于保存函数内部的非
static
对象 - 堆(*空间)用于存储动态分配的对象,要求显式销毁不用的对象
- 头文件
memory
中提供shared_ptr
智能指针以允许多个指针指向同一个对象,提供unique_ptr
智能指针以独占所指对象,智能指针也是模板 - 头文件
memory
中还提供伴随类weak_ptr
,指向shared_ptr
所管理的对象
程序使用动态内存的3种情况
- 不知道要使用多少对象
- 不知道所需对象的准确类型
- 多个对象之间需要共享数据
使用new
和delete
- 使用
new
动态分配和初始化对象,并返回指向该对象的指针,初始化可以采用默认初始化(未定义)、值初始化、列表初始化、括号初始化 -
new
可以分配const
对象,同时也要求对const
对象必须初始化 - 内存耗尽
new
会抛出bad_alloc
异常,可在new
后加(nothrow)
取消抛异常而改为返回空指针,bad_alloc
和nothrow
均在头文件new
中 -
auto
只能推断括号中带有单参数时的类型 - 使用
delete
来销毁对象(必须由new
创建)并释放内存(只可释放一次)
new
和delete
并不被推荐的原因
- 忘记
delete
,不耗尽内存不容易发现该问题 - 使用已经释放掉的对象
- 当两个指针指向同一个对象,容易发生释放两次内存的出错误
两智能指针通用操作
-
shared_ptr<type> sp
和unique_ptr<type> up
,分别定义了空智能指针 -
p.get()
,返回p
中保存的指针 -
swap(p,q)
和p.swap(q)
,交换两智能指针
shared_ptr
独有的操作
-
make_shared<type>(args)
,返回shared_ptr
智能指针,指向由args
初始化(类型对应的构造函数)的对象 -
shared_ptr<type>p(q)
,拷贝智能指针q
到p
上,同时q
中的计数器+1,要求q
的指针类型可以转化为p*
- 任何拷贝都会导致计数器+1,如拷贝初始化、函数传参、函数返回
- 指针获得新值或者被销毁,计数器就会递减,一旦为0,就会自动释放(调用析构函数)
-
shared_ptr<type>p(q,d)
,拷贝智能指针q
到p
上,并用d
来代替delete
-
shared_ptr<type>p(u)
,p
从unique_ptr
智能指针处接管对象的所有权,并将u
置空 -
shared_ptr<type>p(q,d)
,p
接管内置指针q
所指的对象,并使用可调用对象来代替delete
-
p = q
,该操作导致原来p
的计数器递减,q
的计数器递增 -
p.use_count()
,返回与p共享对象的智能指针数量 -
p.unique()
,若p.use_count()
为1,则为true
,否则为false
-
shared_ptr
可以接收new
返回的指针作为初始化参数,但因为该版本的构造函数是explicit
的,所以必须使用直接初始化形式 -
p.reset()
、p.reset(q)
和p.reset(q.d)
,释放对象、令p
指向q
、调用d
而不是调用delete
释放q