读书笔记《C++ Primer》第五版——第十二章 动态内存

shared_ptr和unique_ptr都支持的操作

操作 备注
shared_ptr sp
unique_ptr up
空智能指针
p 若p指向一个对象,条件判断返回true
*p 解引用,获取指向对象
p->mem 等价于(*p).mem
p.get() 返回p中保存的指针,小心使用
swap(p, q)
p.swap(q)
交换p和q中的指针

shared_ptr独有的操作

操作 备注
make_shared(args) 用args初始化一个动态分配的对象
shared_ptr p(q) p是shared_ptr q的拷贝;此操作会递增q中的计数器。q的指针须能转化为T*
p=q 指针须能相互转换,递增q,递减p,若之后p计数为0,则将其原内存释放
p.unique() 返回p.use_count() == 1
p.use_count() 返回与p共享对象的智能指针数量

注意:如果将shared_ptr存放于一个容器中,而后不需要全部元素,记得erase删除不在需要的那些元素

定义和改变shared_ptr的其他方法

操作 备注
shared_ptr p(u) p从unique中接管了对象,u被置空
shared_ptr p(q, d) p从内置指针中接管了对象,使用可调用对象d来代替delete
shared_ptr p(p2, d) p是shared_ptr p2的拷贝,使用可调用对象d来代替delete
p.reset() 递减,p置空
p.reset(q) 令p指向q
p.reset(q,d) 令p指向q,使用可调用对象d来代替delete

注意:智能指针确保异常产生时,管理内存被释放

unique_ptr独有的操作

操作 备注
unique_ptr u2 u2使用类型为D的可调用对象来释放它的指针
unique_ptr u(d) u2使用类型为D的可调用对象d来释放它的指针
u = nullptr 释放u指向对象,将u置为空
u.release() 放弃u指向对象的控制权,将u置为空,返回指向对象的指针
u.reset() 释放u指向对象
u.reset(q) 令u指向内置指针q
u.reset(nullptr) 将u置为空

weak_ptr

操作 备注
weak_ptr w 空weak_ptr
weak_ptr w(sp) 指向shared_ptr,T必须能转化为sp所指向的类型
w = p p可以是一个shared_ptr或一个weak_ptr
w.reset() 将w置空
w.use_count() 与共享对象的shared_ptr的数量
w.expired() 若w.use_count()为0,返回true,否则false
w.lock() 若w.expired()为ture,返回一个空shared_ptr;否则返回一个指向w的对象的shared_ptr

指向数组的unique_ptr

操作 备注
unique_ptr(T[]) u u可以指向一个动态分配的数组,元素类型为T
unique_ptr(T[]) u(p) p为动态分配的数组,p必须能转换为类型T*
u[i] 放回u拥有的数组中位置i的对象

注意:shared_ptr不直接支持动态数组,可使用*(sp.get() + i)

标准库allocator类及其算法

操作 备注
allocator a 定义了一个可为类型T分配内存的allocator对象
a.allocator(n) 分配一段原始的内存,保存n个T类型对象
a.deallocator(p, n) 释放a.allocator(n)创建的指针p所指向的内存,n必须与创建时的n相等
a.construct(p, args) 在内存p处构造一个对象
a.destroy(p) 对p处对象执行析构函数

拷贝和填充为初始化内存的算法

操作 备注
uninitialized_copy(b, e, b2) b2指向内存必须足够大
uninitialized_copy_n(b, n, b2) 拷贝n个迭代器b开始的元素到b2指向内存中
uninitialized_fill(b, e, t) 在迭代器b和e指定的原始内存中创建值为t的对象
uninitialized_fill_n(b, n, t) 从迭代器b开始创建n个值为t的对象

你可能感兴趣的:(C++)