c++智能指针介绍_补充
不明白我做错了什么,这几天老婆给我冷战了起来,也不给我开视频让我看娃了。。哎,心累!趁着今晚的一些空闲时间来对智能指针做个补充吧。
写完上篇“智能指针介绍”后,第二天上班途中时,突然一个疑问盘踞在心头,感觉上篇文章介绍的有些缺陷或者遗漏。
问题引入:当两个智能指针引用同一个heap obj,那么当一个智能指针跳出其scope时,另一个智能指针是怎么知道所引用heap obj的引用数量(use_count)现在变成了1?
如果引用计数是“智能指针类”内部的一个member var,那么其会随着该智能指针而消失,对吧?但是另一个智能指针所拥有的独立的引用计数(member var)不应该知道要减一才对啊!
Android如何实现?
抛出这个问题后,回顾下Android实现的智能指针(更准确说是强弱指针:StrongPoint/WeakPoint即sp/wp)使用方式:sp<XYZ> sp_obj = new XYZ();
安卓中的智能指针所引用的类都有一个要求:XYZ必须从RefBase继承而来,引用计数在基类RefBase中实现。
因此XYZ类对象被多个sp_obj_x所引用时,因为各个sp_obj_x都能访问和修改XYZ类内部的同一个引用计数器,因此可以容易知道什么时候真正释放这个XYZ类对象(heap obj)。
使用者只需sp<XYZ> sp_obj = new XYZ();构造这个对象,回收不用管了(不用手动delete),利用OS系统在函数堆栈调用切换来自动回收这块heap内存。
用机器去做事情我们可以放心,因为它不会犯错。相反,人做事情常常丢三落四。
答案介绍:
如果两个智能指针想知道彼此释放资源与否,那么这两个智能指针之间必须能够“互相通信”,因此内部的“引用计数”就不能被单个类共享!
如何让两个stack obj能够分享信息呢?除了共同引用的heap obj(如果其内部有个ref_cnt,也可以做到,类似与安卓的只能指针)外,只有那个“引用计数”了,其必须是动态内存!
也即是,当第一次引用资源(那个heap obj)时,也即第一个shared_ptr进行构造时,其除了一个内部变量保存这个堆指针外,还需new一块内存,这块内存用于引用计数管理(其内部的ref_cnt先加1);
当第二引用同一个资源时,即进行拷贝构造(shared_ptr( const shared_ptr& r ))时,其除了会引用共同的资源外,还会引用上次new出的那个内存块,并且将ref_cnt再加1,变成2。
这可以解释释放第一个智能指针后,第二个智能指针可以知道所管理的资源的引用数量了。
其它补充:
1.use_count()相当于sp的getStrongCount().
2.weak_ptr的lock()相当于wp的promote(),先获得资源所有权,再判断资源有效性。
3.get()都用于取得所管理的资源的地址。
4.reset()和=NULL(即operator =)都是解除该智能指针对资源的引用,但不一定真正释放资源(同时还被其他智能指针引用)。
5.都重载了->和*,用于访问其管理的资源。
就先说这么多吧,以后想起来了再补充。
c++智能指针介绍_补充的更多相关文章
- 【C++】智能指针简述(六):智能指针总结及补充
本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容. 总结: 1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时 ...
- c++智能指针介绍
C++11标准引入了boost库中的智能指针,给C++开发时的内存管理提供了极大的方便.接下来这篇文件介绍shared_ptr/weak_ptr内部实现原理及使用细节. C++不像java有内存回收机 ...
- auto_ptr,shared_ptr 智能指针的使用
Q: 那个auto_ptr是什么东东啊?为什么没有auto_array?A: 哦,auto_ptr是一个很简单的资源封装类,是在<memory>头文件中定义的.它使用“资源分配即初始化”技 ...
- 19.C++-(=)赋值操作符、智能指针编写(详解)
(=)赋值操作符 编译器为每个类默认重载了(=)赋值操作符 默认的(=)赋值操作符仅完成浅拷贝 默认的赋值操作符和默认的拷贝构造函数有相同的存在意义 (=)赋值操作符注意事项 首先要判断两个操作数是否 ...
- C++智能指针shared_ptr
shared_ptr 这里有一个你在标准库中找不到的—引用数智能指针.大部分人都应当有过使用智能指针的经历,并且已经有很多关于引用数的文章.最重要的一个细节是引用数是如何被执行的—插入,意思是说你将引 ...
- 详解C++11智能指针
前言 C++里面的四个智能指针: auto_ptr, unique_ptr,shared_ptr, weak_ptr 其中后三个是C++11支持,并且第一个已经被C++11弃用. C++11智能指针介 ...
- 【原/转】【boost】智能指针使用规则以及介绍
智能指针机制跟Objective-C里面的retainCount引用计数有着相同的原理,当某个对象的引用计数为0是执行delete操作,类似于autorelease 初学者在使用智能指针时,很多情况下 ...
- React Native 4 for Android源码分析 一《JNI智能指针之介绍篇》
文/ Tamic: http://blog.csdn.net/sk719887916/article/details/53455441 原文:http://blog.csdn.net/eewolf/a ...
- C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
1.野指针的概念.成因以及避免 首先,来说说什么是野指针,所谓野指针就是一个指向未申请访问受限的内存区域或者已经删除了的对象的指针. 什么意思呢?就是本来一个指针指向一个对象.一块内存,但是由于程序( ...
随机推荐
- 解决无法将java项目部署到tomcat中去
project facets java转成web项目 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个Java工程,将无法在Tomcat中进行部署运行. 方法: 1. ...
- 笔记 - DBSherlock: A Performance Diagnostic Tool for Transactional Databases
OLTP系统的问题很难排查和定位,这就是为什么要花那么多钱去请DBA 因为TP系统的请求很多都是毫秒级别,而且同时有大量的并发,所以由于资源,或随机的原因导致的问题,很难去定位根因 哪怕数据库系统尤其 ...
- Linux的桌面虚拟化技术KVM(三)——KVM虚拟机克隆和快照
Linux的桌面虚拟化技术KVM(一)——新建KVM虚拟机 Linux的桌面虚拟化技术KVM(二)——远程桌面管理 (1).KVM虚拟机克隆 KVM虚拟克隆命令virt-clone [选项] 常用选项 ...
- haproxy高可用、负载均衡集群
HAProxy提供高可用性.负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费.快速并且可靠的一种解决方案.根据官方数据,其最高极限支持10G的并发.另外其支持从4层至7层的网络交换, ...
- Shell中 2>/dev/null
1.文件描述符 Linux系统预留可三个文件描述符:0.1和2,他们的意义如下所示: 0——标准输入(stdin) 1——标准输出(stdout) 2——标准错误(stderr) 标准输出——stdo ...
- Asynchronous Streaming Request Processing in Spring MVC 4.2 + Spring Boot(SpringBoot中处理异步流请求 SpringMvc4.2以上)
With the release of Spring 4.2 version, Three new classes have been introduced to handle Requests As ...
- 分类:logistic回归
import numpy as np import matplotlib.pyplot as plt x=np.linspace(-1,1,200) y=1/(1+np.exp(10*x-1)) pl ...
- ubuntu18.04安装DB2 11.1 Express-c
参考连接:https://developer.ibm.com/answers/questions/280797/download-db2-express-c-105-1/ 这个参考页面提供了DB2 E ...
- 【error】OutOfRangeError (see above for traceback): RandomShuffleQueue
前言 在使用tensorflow TFRecord的过程中,读取*.tfrecord文件时出现错误,本文解决这个错误. 错误描述: OutOfRangeError (see above , curre ...
- 【linux学习笔记一】目录处理命令
一 建立目录:mkdir make directories //创建一个name的目录 mkdir name //-p 递归创建 //在没有目录a也没有目录b的情况下 直接创建 mkdir -p a/ ...