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

来源:互联网 发布:身份证复制软件3.7 编辑:程序博客网 时间:2024/05/18 01:33

shared_ptr和unique_ptr都支持的操作

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

shared_ptr独有的操作

操作 备注 make_shared<T>(args) 用args初始化一个动态分配的对象 shared_ptr<T> 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<T> p(u) p从unique中接管了对象,u被置空 shared_ptr<T> p(q, d) p从内置指针中接管了对象,使用可调用对象d来代替delete shared_ptr<T> 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<T, D> u2 u2使用类型为D的可调用对象来释放它的指针 unique_ptr<T, D> 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<T> w 空weak_ptr weak_ptr<T> 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<T> 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的对象
阅读全文
0 0