03智能指针
时间:2020-04-17
本文章向大家介绍03智能指针,主要包括03智能指针使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
#include <iostream>
#include <memory>
using namespace std;
struct MyStruct
{
MyStruct()
{
cout << "MyStruct() this:"<< this << endl;
}
~MyStruct()
{
cout << "~MyStruct()this:" << this << endl;
}
};
void printSharedPtrInfo(const string& pName, const shared_ptr<MyStruct>& sp)
{
cout << pName.c_str() <<"\tuse_count():" << sp.use_count() << "\t";
cout << sp.get() << endl;
}
void foo(const shared_ptr<MyStruct> sp)
{
cout << "enter the function foo()" << endl;
printSharedPtrInfo("sp",sp);
}
int main()
{
//1.智能指针计数器递增
cout << "test use_count increasing........................." << endl;
//1.1.第一次将构造的对象赋值给sp,此时sp的引用计数为1
auto sp = make_shared<MyStruct>();
printSharedPtrInfo("sp",sp); //use_count(): 1
//1.2.进行一次赋值,引用计数+1,此时sp的引用计数为2
auto sp1 = sp;
printSharedPtrInfo("sp", sp); //use_count(): 2
//1.3.sp1与sp指向同一块内存,所以引用计数相同
printSharedPtrInfo("sp2", sp1); //use_count(): 2
//1.4.进行一次拷贝构造,引用计数+1,此时sp的引用计数为3
auto sp2(sp);
printSharedPtrInfo("sp", sp); //use_count(): 3
printSharedPtrInfo("sp1", sp1); //use_count(): 3
printSharedPtrInfo("sp2", sp2); //use_count(): 3
//1.5.作为参数传递给一个函数,引用计数+1,此时函数内部引用计数为4
foo(sp); //use_count(): 4
//1.6.离开函数作用域,函数内部局部对象被销毁,引用计数-1,此时引用计数为3
printSharedPtrInfo("sp1", sp1); //use_count(): 3
//2.智能指针计数器递减
cout << "test use_count reducing........................." << endl;
//2.1.第一次将构造的对象赋值给sp,引用计数为1
auto spp = make_shared<MyStruct>();
//2.2.进行一次赋值,引用计数+1
auto spp1 = spp;
printSharedPtrInfo("spp", spp); //2
{
//2.2大括号作用域内,spp赋值给sp2,引用计数+1,此时spp的引用计数为2
auto sp2 = spp;
printSharedPtrInfo("spp", spp); //3
}
//2.3.离开大括号作用域内,引用计数-1, 此时spp的引用计数为1
printSharedPtrInfo("spp", spp); //2
//2.4.智能指针调用 reset,清零引用计数,并释放资源
cout << "test reset()........................." << endl;
spp.reset();
printSharedPtrInfo("spp", spp); //0
printSharedPtrInfo("sp", sp); //3
//2.5.将一个应用计数为0的智能指针赋值给sp,则sp也清零引用计数,并释放资源
sp = spp;
printSharedPtrInfo("sp", sp); //0
printSharedPtrInfo("spp", spp); //0
}
原文地址:https://www.cnblogs.com/rock-cc/p/12718797.html
- linux(十三)之磁盘分区、创建文件系统、挂载
- LINQ驱动数据的查询功能
- JS魔法堂:jQuery.Deferred(jQuery1.5-2.1)源码剖析
- 一步一步学习Bootstrap系列--表单布局
- Java进阶01 String类
- linux(十二)之用户管理
- Dapper.Net 应用
- linux(十)配置ssh免密登录实现
- 微信群也有群相册功能了,终于可以给手机相册腾出空间了!
- PHP5.3、PHP5.4安装ZendOptimizer
- linux(十一)之初始化文件
- C编译: 动态连接库 (.so文件)
- 腾讯叮当首都发布生态合作伙伴计划,全面开放AI能力
- Python火爆的背后的应用领域是数据挖掘、大数据和人工智能的应用吗?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux sudo 漏洞可能导致未经授权的特权访问
- 在Linux中如何轻松删除源安装的软件包
- linux系统 java环境变量的配置方法
- Apache 文件上传与文件下载案例详解
- 前端CLI脚手架思路解析并从0到1搭建
- Linux中搭建完整的samba服务器全攻略(centos版)
- Linux 命令行通配符及转义符的实现
- Linux采用双网卡bond、起子接口的方式
- 在Linux分区或逻辑卷中创建文件系统的方法
- Linux下通过sed命令对kv方式的配置文件进行修改
- Linux中将txt导入到mysql的方法教程
- LNMP部署及HTTPS服务开启教程
- 在 Linux 上锁定虚拟控制台会话的实现方法
- Linux中split大文件分割和cat合并文件详解
- centos下安装配置phpMyAdmin的方法步骤