shared_ptr和weak_ptr使用介绍
文章目录
- 1 shared_ptr使用介绍
- 1.1 shared_ptr使用介绍
- 1.2 shared_ptr的使用陷阱
- 2 weak_ptr使用简介
1 shared_ptr使用介绍
1.1 shared_ptr使用介绍
熟悉了unique_ptr 后,其实我们发现unique_ptr 这种排他型的内存管理并不能适应所有情况,有很大的局限!如果需要多个指针变量共享怎么办?
如果有一种方式,可以记录引用特定内存对象的智能指针数量,当复制或拷贝时,引用计数加1,当智能指针析构时,引用计数减1,如果计数为零,代表已经没有指针指向这块内存,那么我们就释放它!这就是 shared_ptr 采用的策略!
构造函数:
shared_ptr<T> sp ; //空的shared_ptr,可以指向类型为T的对象
shared_ptr<T> sp1(new T()) ;//定义shared_ptr,同时指向类型为T的对象
shared_ptr<T[]> sp2 ; //空的shared_ptr,可以指向类型为T[的数组对象 C++17后支持
shared_ptr<T[]> sp3(new T[]{...}) ;//指向类型为T的数组对象 C++17后支持
shared_ptr<T> sp4(NULL, D()); //空的shared_ptr,接受一个D类型的删除器,使用D释放内存
shared_ptr<T> sp5(new T(), D()); //定义shared_ptr,指向类型为T的对象,接受一个D类型的删除器,使用D删除器来释放内存
初始化:
// 方式一 构造函数
shared_ptrr<int> up1(new int(10)); //int(10) 的引用计数为1
shared_ptrr<int> up2(up1); //使用智能指针up1构造up2, 此时int(10) 引用计数为2// 方式二 使用make_shared 初始化对象,分配内存效率更高make_shared函数的主要功能是在动态内存中分配一个对象并初始化它,返回指向此对象的shared_ptr; 用法:make_shared<类型>(构造类型对象需要的参数列表);
shared_ptr<int> p4 = make_shared<int>(2); //多个参数以逗号','隔开,最多接受十个
shared_ptr<string> p4 = make_shared<string>("字符串");
赋值:
shared_ptrr<int> up1(new int(10)); //int(10) 的引用计数为1
shared_ptr<int> up2(new int(11)); //int(11) 的引用计数为1
up1 = up2;//int(10) 的引用计数减1,计数归零内存释放,up2共享int(11)给up1, int(11)的引用计数为2
主动释放对象:
shared_ptrr<int> up1(new int(10));
up1 = nullptr ;//int(10) 的引用计数减1,计数归零内存释放
up1 = NULL; //作用同上
重置:
up.reset() ; //将p重置为空指针,所管理对象引用计数减1
up.reset(p1); //将p重置为p1(的值),p 管控的对象计数减1,p接管对p1指针的管控
up.reset(p1,d); //将p重置为p(的值),p 管控的对象计数减1并使用d作为删除器
交换:
std::swap(p1,p2); //交换p1 和p2 管理的对象,原对象的引用计数不变
p1.swap(p2); //同上
1.2 shared_ptr的使用陷阱
shared_ptr作为被管控的对象的成员时,小心因循环引用造成无法释放资源!
示例代码如下:
#include <stdio.h>
#include <iostream>
#include <string>
#include <memory>
#include <vector>using namespace std;class girl;class boy {public:boy() {cout << "boy construct!" << endl;}~boy() {cout << "boy destruct!" << endl;}void set_girl_friend(shared_ptr<girl> &g) {girl_friend = g;}
private:shared_ptr<girl> girl_friend;
};class girl {public:girl() {cout << "girl construct!" << endl;}~girl() {cout << "girl destruct!" << endl;}void set_boy_friend(shared_ptr<boy> &b) {boy_friend = b;}
private:shared_ptr<boy> boy_friend;
};void use_trap() {shared_ptr<girl> sp_girl(new girl());//白娘子shared_ptr<boy> sp_boy(new boy()); //许仙sp_girl->set_boy_friend(sp_boy);sp_boy->set_girl_friend(sp_girl);}int main() {use_trap();system("pause");return 0;
}
2 weak_ptr使用简介
weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作, 它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造, 它的构造和析构不会引起引用记数的增加或减少。同时weak_ptr 没有重载*和->,但可以使用 lock 获得一个可用的 shared_ptr 对象(引用计数会增加1)。
一般情况下我们无需使用weak_ptr,只有在特殊的情况下才需要使用weak_ptr!
参考资料:
- C/C++从入门到精通-高级程序员之路【奇牛学院】
shared_ptr和weak_ptr使用介绍相关推荐
- C++智能指针:TR1的 shared_ptr 和 weak_ptr 使用介绍
(所有示例的运行,将#序号所在main()函数去掉序号即可,参考[url]http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c15361/ ...
- C++11智能指针(unique_ptr、shared_ptr、weak_ptr)boost::scoped_ptr
C++11智能指针(unique_ptr.shared_ptr.weak_ptr)_-码农小非-的专栏-CSDN博客_c++ shared_ptr weak_ptr 原创)智能指针拾遗 (原创)智能指 ...
- C++11中的智能指针unique_ptr、shared_ptr和weak_ptr详解
目录 1.引言 2.什么是智能指针? 3.在Visual Studio中查看智能指针的源码实现 4.独占式指针unique_ptr 4.1.查看unique_ptr的源码实现片段 4.2.为什么uni ...
- C++ | shared_ptr与weak_ptr
文章目录 前言 一.shared_ptr与weak_ptr是什么? 1.shared_ptr的内存模型 2.weak_ptr的内存模型 二.仿写系统的shared_ptr与weak_ptr 1.mde ...
- c++11 智能指针 unique_ptr、shared_ptr与weak_ptr
C++11中有unique_ptr.shared_ptr与weak_ptr等智能指针(smart pointer),定义在<memory>中. 可以对动态资源进行管理,保证任何情况下,已构 ...
- C++笔记-shared_ptr与weak_ptr需要注意的地方
目录 基本概念 代码与实例 基本概念 share_ptr使用的是引用计数,每一个shared_ptr都指向相同的内存.只有最后一个shared_ptr析构的时候,才会释放内存,不建议直接用shared ...
- shared_ptr,weak_ptr使用最广范的智能指针
一:shared_ptr 基本概念: shared_ptr通过一个引用计数,共享一个对象,shared_ptr为了解决unique_ptr在对象所有权上的局限性,在使用引用计数的机制上提供了可以共享对 ...
- C++2.0 shared_ptr和weak_ptr深入刨析
在gnu c++中讨论shared_ptr和weak_ptr只需要讨论__shared_count和__weak_count,另外就是weak_ptr没有定义operator ->和operat ...
- C++11智能指针shared_ptr、weak_ptr、unique_ptr用法
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105065859 智 ...
最新文章
- mybatis中(Oracle)关于insert时主键自动加1的使用方法
- Mybatis原理分析之一:从JDBC到Mybatis
- HOOK技术-满足我们程序的偷窥欲
- mysql proxy 读写分离 1
- Entity Framework Core的贴心:优雅处理带默认值的数据库字段
- python的selenium模块_Python中Selenium模块的使用
- oracle非归档模式与归档模式的备份
- 2.13 向量化 logistic 回归
- mpc 安全多方计算协议_HashKey:说透安全多方计算 MPC 技术方案、挑战与未来
- java 观察者模式_观察者模式(Observer Pattern)
- CRM----管理软件分析(	ERP/CRM/OA)
- C语言反汇编 - 函数与结构体
- Ubuntu 下安装 Vysor投屏软件
- 一卡通管理系统总体设计
- 网站搜索引擎优化诊断
- PLSQL连接Oracle11g64位操作步骤
- ES6语法——for...in..以及字符串新增操作
- python ——随机选取n个元素
- WIN 7 MSN 80040154 登录问题
- 优惠码:牛客网-直通BAT面试算法精品课