关于智能指针类型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_ ...
随机推荐
- Folyd + 路径存储
一.Folyd 算法原理 如果 AB + AC < BC 那么, BC最短路就要经过 A. 在算法进行过程中,应该是 ,B-A 有很多路径,B 代表这些路径权值之和,A-C也有很多路径,C是这些 ...
- mysql复制表结构和数据
1.复制表结构: create table newName like oldName;//可以复制所有结构. 或者: create table newName select * from oldNam ...
- 安装mysql8.13用Navicat Premium链接本地数据库报2059
推荐使用已下命令: ALTER USER 'root'@'localhost' IDENTIFIED BY 'password' PASSWORD EXPIRE NEVER; #修改加密规则 ALTE ...
- React Native开发之expo中camera的基本使用
之前做RN项目没调用过本地摄像头,今天下班早,做了一个简单的小demo:主要实现的功能:点击拍照按钮进入拍照界面,点击flip进行前后摄像头转换,点击开始拍照实现拍照功能(没写保存到本地的功能,大家可 ...
- shell中的死记硬背
一.shell的引号们 1."" -> 双引号(不保留完整内容,比如遇到$, 反引号, \ 等就会执行相应的shell) echo "Today is `date` ...
- mac安装ruby-oci8
1.安装xcode 2.从oracle官网下载以下安装包 instantclient-basic-macos.x64-12.1.0.2.0.zip instantclient-sdk-macos.x6 ...
- java 用户修改密码
import java.util.Scanner; class Member { private String mima; private String name; public String get ...
- java 异常与捕获
几乎所有的代码里面都会出现异常,为了保证程序在出现异常之后可以正常执行完毕,就需要进行异常处理. 先来看一下异常的继承类结构: 所有的异常都是由Throwable继承而来,我们来看他下面的两个子类Er ...
- python note 001
.tilte() .upper() .lower() --- \n \t --- "apple"+" "+"pen" --- .strip( ...
- CSS基础part1
CSS 概述CSS 指层叠样式表 (Cascading Style Sheets),样式定义了如何显示 HTML文件中的标签元素,CSS是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标 ...