博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
12.1动态内存与智能指针
阅读量:6802 次
发布时间:2019-06-26

本文共 2642 字,大约阅读时间需要 8 分钟。

1.shared_ptr<>:允许多个指针指向同一个对象初始化方式:    shared_ptr
p1 = make_shared
(10);//最好使用这种方式 shared_ptr
p2(new int(20)); //只能用直接初始化方式和普通指针有一样的操作,*,->,swap等支持拷贝与赋值与自定义删除器,特别地: p.get()能返回p中保存的指针,如果指针指针释放了其对象,返回指针所指的对象也就消失了。 p.use_count()返回与p共享的只能指针数量,比较慢,主要用来调试。 p.unique()若p.use_count()为1,返回true,否则返回false。shared_ptr会自动销毁所管理的对象并且会自动释放相关联的内存。原因是因为内存采用了:引用计数。当计数为0就会自动释放。 p1 = p2; //p2引用计数加1,p1引用计数减1不能将一个内置指针隐式转化为指针指针shared_ptr
f(int p){ return shared_ptr
(new int(p));//不能直接放回new int(p)}shared_ptr
p(q); //p管理内置指针q所指的对象,q必须指向new分配的内存,且能够转换为T*类型shared_ptr
p(u); //p从unique_ptr u接管对象的所有权,将u置为空shared_ptr
p(q, d); //q为内置指针,d为可调用对象作为删除器shared_ptr
p(p2, d);//p是shared_ptr2的拷贝,p使用对象d作为删除器p.reset(); //释放p,将p置为空p.reset(q); //p会指向qp.reset(q, d); //调用删除器dshared_ptr不支持管理动态数组,当初始化动态数组时必须定义自己的删除器: shared_ptr
p(new int[10], [](int *n){ delete[]n; });//必须要自定义删除器因此访问数组中的元素操作也会不同: for(int i = 0; i < 10; ++i) { *(p.get() + i) = u(e);//只能通过get()来访问 }注意:不要用get初始化另一个智能指针或者为另一个智能指针赋值2.unique_ptr<>:独占所指向的对象,也就是同一时刻只能有一个unique_ptr指向一个给定的对象初始化形式: unique_ptr
p(new int(10)); //只能直接初始化不支持拷贝与赋值支持自定义删除器,和普通指针也有*,->,swap等,也有get()函数unique_ptr
u1; //指向类型为T的对象,会使用deleteunique_ptr
u2; //会使用删除器D来释放unique_ptr
u(d);//空unique_ptr,使用d来代替deleteu = nullptr; //释放u所指的对象,将u置为空u.release(); //u放弃对指针的控制权,返回指针,将u置为空u.reset(); //释放u所指的对象u.reset(q); //如果提供内置指针q,令u指向这个对象u.reset(nullptr);unique_ptr能够管理动态数组: unique_ptr
a; unique_ptr
a(new int[10]); //注意类型 能够使用u[i]访问数组其他操作和普通一样3.weak_ptr<>:不控制所指向对象生存期的只能指针,指向由一个shared_ptr管理的对象初始化形式: weak_ptr
w; //p必须为shared_ptr weak_ptr
w = p; weak_ptr
w(p); w = p; w.reset() //将w置为空 w.use_count(); //与w共享对象的shared_ptr数量 w.expired(); //若w.use_count()为0,返回true,否则返回false w.lock(); //如果expired为true,返回一个空shared_ptr,否则返回一个指向w的对象的shared_ptr注意:由于对象可能不存在,不能直接访问对象,需要使用lockweak_ptr有一个非常有用的地方在于,破除shared_ptr的循环引用:class A{public: A(int a) : i(a) {} ...public: int i; shared_ptr
p;};int main(){ shared_ptr
one = make_shared
(1); shared_ptr
two = make_shared
(2); one->p = two; two->p = one; return 0;}这种情况造成了循环引用,作用域结束时one和two都不会被释放,正确的做法是将one和two其中一个变为weak_ptrclass A;class B;class A{private: shared_ptr p;};class B{private: shared_ptr
p;};这种情况也造成了循环引用,应该讲其中一个变为weak_ptr

 

转载于:https://www.cnblogs.com/CoderZSL/p/7955878.html

你可能感兴趣的文章
VMware host-only模式上网设置
查看>>
使用活动目录组策略添加客户端端远程开机自动运行程序
查看>>
tomcat指定虚拟目录
查看>>
TODO:即将开发的第一个小程序
查看>>
我的友情链接
查看>>
Thanks for the memory, Linux
查看>>
制作WinPE3.0 32位与64位的双启动BCD文件
查看>>
Java8新特性之:流(二)
查看>>
JAVA学习笔记(初级)--面向对象基础
查看>>
Mybatis开发步骤
查看>>
Making your C++ code robust<three>
查看>>
jfreechart Line多个曲线图,曲线点图
查看>>
Ubuntu 16.04 设置固定IP地址
查看>>
资源合作推广方法
查看>>
利用vim多行注释和多行删除命令配置nginx.conf文件
查看>>
2014还是选择重新开始
查看>>
Dubbo架构设计详解
查看>>
php提取字符串中的数字
查看>>
JavaScript之函数
查看>>
azkaban3.x web-server之 jobsummary插件安装
查看>>