关于智能指针类型shared_ptr的计数问题
一、关键
每个shared_ptr所指向的对象都有一个引用计数,它记录了有多少个shared_ptr指向自己
shared_ptr的析构函数:递减它所指向的对象的引用计数,如果引用计数变为0,就会销毁对象并释放相应的内存
引用计数的变化:决定权在shared_ptr,而与对象本身无关
二、引用计数初步
shared_ptr<int> sp; //空智能指针
shared_ptr<int> sp2 = make_shared<int>(3);
shared_ptr<int> sp3(sp2);
cout << sp.use_count() << endl; //输出0
cout << sp2.use_count() << endl; //输出2
注:sp.use_count()函数返回sp所指对象的引用计数
三、引用计数增加的情况
拷贝一个shared_ptr,其所指对象的引用计数会递增,如:
- 用一个shared_ptr初始化另一个shared_ptr
- 用一个shared_ptr给另一个shared_ptr赋值
- 将shared_ptr作为参数传递给一个函数
- shared_ptr作为函数的返回值
四、引用计数减少的情况
- 给shared_ptr赋予一个新值
- shared_ptr被销毁(如离开作用域)
五、迷途返航
1. 局部的shared_ptr离开其作用域,它所指对象的引用计数会递减(-1)
假设:没有全局的shared_ptr,那么正确的结果应该是该shared_ptr所指的对象被销毁
我之前错误的想法:多个局部shared_ptr共同指向同一个对象,那么该对象的引用计数就>1,该函数结束时对象的引用计数减1(但仍>0),那么该对象不应该被销毁。
纠正想法:既然是多个局部shared_ptr指向该对象,那么函数结束时对象的引用计数就不应该只减1啊!!
shared_ptr<int> init()
{
shared_ptr<int> sp2 = make_shared<int>(3);
shared_ptr<int> sp3(sp2);
cout << sp2.use_count() << endl; //输出2
return sp2; //返回sp2,故引用计数递增,变为3
} //sp2和sp3离开作用域,引用计数减2,变为1 int main()
{
auto p = init(); //此处赋值的拷贝与return处的拷贝是一致的
cout << p.use_count() << endl; //输出1
return 0;
}
由代码证实,函数结束时,引用计数减2,而非减1!
关于智能指针类型shared_ptr的计数问题的更多相关文章
- 【C++11新特性】 C++11智能指针之shared_ptr
C++中的智能指针首先出现在“准”标准库boost中.随着使用的人越来越多,为了让开发人员更方便.更安全的使用动态内存,C++11也引入了智能指针来管理动态对象.在新标准中,主要提供了shared_p ...
- C++智能指针之shared_ptr与右值引用(详细)
1. 介绍 在 C++ 中没有垃圾回收机制,必须自己释放分配的内存,否则就会造成内存泄露.解决这个问题最有效的方法是使用智能指针(smart pointer).智能指针是存储指向动态分配(堆)对象指针 ...
- C++ | 再探智能指针(shared_ptr 与 weak_ptr)
上篇博客我们模拟实现了 auto_ptr 智能指针,可我们说 auto_ptr 是一种有缺陷的智能指针,并且在C++11中就已经被摈弃掉了.那么本章我们就来探索 boost库和C++11中的智能指针以 ...
- 智能指针之shared_ptr基本概述
1.shared_ptr允许有多个指针指向同一个对象,unique_ptr独占所指向的对象. 2.类似于vector,智能指针也是模板.创建智能指针: shared_ptr<string> ...
- 智能指针(二):shared_ptr实现原理
前面讲到auto_ptr有个很大的缺陷就是所有权的转移,就是一个对象的内存块只能被一个智能指针对象所拥有.但我们有些时候希望共用那个内存块.于是C++ 11标准中有了shared_ptr这样的智能指针 ...
- 【STL学习】智能指针之shared_ptr
前面已经学习过auto_ptr,这里补充另外一种智能指针,比auto_ptr要更强力更通用的shared_ptr. shared_ptr 简介及使用选择 几乎所有的程序都需要某种形式的引用计数智能指 ...
- 智能指针auto_ptr & shared_ptr
转载:智能指针auto_ptr 很多人听说过标准auto_ptr智能指针机制,但并不是每个人都天天使用它.这真是个遗憾,因为auto_ptr优雅地解决了C++设计和编码中常见的问题,正确地使用它可以生 ...
- 智能指针之 shared_ptr
std::shared_ptr 是通过指针保持对象共享所有权的智能指针.多个 shared_ptr 对象可占有同一对象大概实现了一下,主要实现原理为,共享指针内部持有堆资源 的指针以及引用计数的指针 ...
- C++11 新特性之智能指针(shared_ptr, unique_ptr, weak_ptr)
这是C++11新特性介绍的第五部分,涉及到智能指针的相关内容(shared_ptr, unique_ptr, weak_ptr). shared_ptr shared_ptr 基本用法 shared_ ...
随机推荐
- 【模板】RMQ(计算区间最值)
①一维RMQ (1) dp[i,j] 表示从第i个数起连续2j个数中的(最大值min.最小值max.最大公约数gcd……),通过更改下列代码中的红色函数即可实现. (2) b数组放置所需查询的数列. ...
- ubuntu18.04错误配置变量环境导致无法进入系统
1.问题描述 错误配置环境变量(直接在/etc/profile文件末尾添加了export xxx),关机后一直在登录界面循环无法进入系统. ###环境变量的添加是在原有变量之后以冒号(:)分隔加入,并 ...
- 关于iconfont symbol引入字体的方式
1,下载想要使用的图标集合 2,下载的压缩包解压到将要使用的目录下: 3,使用: 4,效果
- TinyMCE插件:Filemanager [4.x-6.x] 图片自动添加水印
上传图片程序(filemanager/upload.php) 在if (!empty($_FILES) && $upload_files)有一个move_uploaded_file() ...
- spring-mvc高级技术
Spring MVC高级技术包括但不限于web.xml配置.异常处理.跨重定向请求传递数据 1.web.xml文件的配置 <!DOCTYPE web-app PUBLIC "-//Su ...
- linux进程篇 (二) 进程的基本控制
2. 进程的基本操作 接口函数 #include <unistd.h> //创建子进程 pid_t fork(void); //结束子进程 void exit(int status); / ...
- linux 下安装 Cisco Packet Tracer 7.11以及一些注意
https://blog.csdn.net/qq_35882901/article/details/77652571 https://linux.cn/article-5576-1.html 开启登录 ...
- Scratch入门课程(1)——把工具准备好
为了让更多的同学了解少儿编程,从今天开始,我将以每周1次的频率发布Scratch的入门课程,大约在30课时左右. 几点情况说明: 1.这批课程主要面向2-4年级的同学,难度都不大,按照教程可以很轻松地 ...
- 成都Uber优步司机奖励政策(3月27日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 成都Uber优步司机奖励政策(1月14日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...