auto_ptr的VC版本源码剖析
auto_ptr是当前C++标准库(STL)中提供的一种智能指针,包含于头文件 #include<memory> 。auto_ptr 能够方便的管理单个堆内存对象,在你不用的时候自动帮你释放内存。
一个版本的auto_ptr是Linux和VS中使用的,另一个是VC版本的,下面是VC版本的auto_ptr的源代码剖析:
template<class _Ty>
class auto_ptr
{
public:
explicit auto_ptr(_Ty *_P=):_Owns(_P!=),_Ptr(_P) //构造
{} ~auto_ptr() //析构
{
if (_Owns) //当拥有权限为真,delete指针所指向的内容
{
delete _Ptr;
}
} auto_ptr(const auto_ptr<_Ty> &_Y):_Owns(_Y._Owns),_Ptr(_Y.release()) //拷贝构造
{} auto_ptr<_Ty>& operator=(const auto_ptr<_Ty> &_Y) //拷贝赋值
{
//若pa2=pa1
if (this!=&_Y) //当两个对象不是自身复制
{
if (_Ptr!=_Y._Ptr) // 当pa2和pa1指向地址不同
{
if (_Owns) //pa2有指向,就析构pa2指向的内容
{
delete _Ptr;
}
_Owns = _Y._Owns; //将pa1的拥有权限转移到pa2
}
else if(_Y._Owns) //如果pa1和pa2指向地址相同,判断pa1是否有拥有权
{
_Owns = true; //如果pa1有拥有权,则pa2赋值为有拥有权
}
_Ptr = _Y.release(); //将pa1拥有权释放,并将pa1指针赋值给pa2
}
return *this; // 返回pa2
} _Ty& operator*() const //重载*
{
return *_Ptr;
} _Ty* operator->() const //重载->
{
return _Ptr;
} _Ty* release() const //将拥有权限释放,并返回指针 //常对象只能调用常方法所以要加const
{
((auto_ptr<_Ty>*) this)->_Owns = false; //将拥有权限释放 //强制转换是为了让const失去作用,就是将const auto_ptr类型强转为auto_ptr类型,就可以修改_Y了,但出了这一步,_Y还是const的,_Y.Owns=0;就会报错
return _Ptr;
} private:
bool _Owns; //加了mutable关键字,此变量就不受const的限制,但是不安全
_Ty *_Ptr;
};
当pa2 = pa1时 :
1.pa2 无指向 : 将pa1的指针给pa2赋值,再将pa1将拥有权进行转移;
2.pa2 有指向不同于pa1的对象 : 将pa2的指向进行析构,再将pa1的指针给pa2赋值,将pa1的拥有权转移;
3.pa2 有指向和pa1相同的对象 : 判断pa1是否有拥有权,有则将pa1的拥有权转移给pa2。
但vc版的auot_ptr也有一些问题,就是将拥有权转移后,除了不能够对其多次析构外,还可以对其进行操作,这就不好了,你都已经分手了,还不放手。在VS版本上对拥有权有更好的管理。
如果两个指针指向一个空间但是都没有拥有权,最后需要用delete释放。
auto_ptr的VC版本源码剖析的更多相关文章
- auto_prt的VS版本源码剖析
通过对VC版本的auto_ptr的源代码得知VC版本还有一点小缺陷,又对VS版本的auto_ptr做了一些剖析,具体代码和注释如下: //假设全局pa2都是用pa1来构造 //如:pa2(pa1).p ...
- spring各个版本源码
各版本源码下载地址 http://maven.springframework.org/release/org/springframework/spring/
- Spring各版本源码下载
spring framework 各版本源码下载地址 现在spring的源码下载地址真是不好找,这次终于找到了.记录一下,以帮助需要的朋友. https://github.com/spring-pro ...
- [转帖]nginx1.17.2版本源码安装
nginx1.17.2版本源码安装 原创: 沧海书生 Ansible爱好者 昨天 公众号里面的内容 这里简单测试了下 在x86的虚拟机里面编译安装 nginx 仅make make install n ...
- Kafka 0.10.1版本源码 Idea编译
Kafka 0.10.1版本源码 Idea编译 1.环境准备 Jdk 1.8 Scala 2.11.12:下载scala-2.11.12.msi并配置环境变量 Gradle 5.6.4: 下载Grad ...
- 任务驱动,Winform VS WEB对比式学习.NET开发系列第一篇------身份证解析(不断更新的WEB版本及Winform版本源码)
一 本系列培训随笔适用人群 1. 软件开发初学者 2. 有志于转向Web开发的Winform程序员 3. 想了解桌面应用开发的Web程序员 二 高效学习编程的办法 1 任务驱动方式学习软件开发 大部分 ...
- 网站安全通用防护代码(C#版本源码提供)
每一个开发者都会意识到,网站发布之前,需要进行安全检查. 那么如何拦截攻击者注入恶意代码?如何防御诸如跨站脚本攻击(XSS).SQL注入攻击等恶意攻击行为? 针对目前常见的一些安全问题,结合目前一些常 ...
- spring framework 各版本源码下载地址
现在spring的源码下载地址真是不好找,这次终于找到了.记录一下,以帮助需要的朋友. https://github.com/spring-projects/spring-framework/tags ...
- jquery的2.0.3版本源码系列(6):2880-3042行,回调对象,对函数的统一管理
目录 1 . 回调对象callbacks的演示 回调的使用有一点像事件绑定,先绑定好,等到有点击事件或者其他时就触发. <script src="js/jquery-2.0.3.js& ...
随机推荐
- Dubbo-服务注册中心之AbstractRegistry
在dubbo中,关于注册中心Registry的有关实现封装在了dubbo-registry模块中.提供者(Provider)个消费者(Consumer)都是通过注册中心进行资源的调度.当服务启动时,p ...
- adworld MISC002 | Linux的挂载文件系统的运用
EXT3是第三代扩展文件系统(英语:Third extended filesystem,缩写为ext3),是一个日志文件系统,常用于Linux操作系统. Plan 1: 直接将附件使用mount命令挂 ...
- web服务器、Web中间件和Web容器的区别
web服务器>web中间件>web容器 Tomcat(servlet容器) 是 Tomcat中间件 也是 Tomcat服务器 看了谢公子的csdn文章,让我彻底分清了这三者的区别. ...
- 拦截器 Filter : js、css、jpg、png等静态资源不被拦截解决方案
方案一: web.xml配置文件拦截范围缩小 ,没有必要 /*的配置拦截项目下所有资源. <filter> <filter-name>Login</filter-name ...
- 三行代码实现垂直居中和cube
三行代码实现上下居中 position: relative;top: 50%;transform: translateY(-50%); 效果如下: 代码: <!DOCTYPE html> ...
- badge徽章、挂件模版
markdown语法 Gitee卡片 Gitee挂件 Github挂件 Gitee卡片 [![gqzdev/ForFuture Group](https://gitee.com/zhong96/sho ...
- Hello world-初识C++
刚开始学习编程时,都是以输出Hello world开始的 用C++编写程序输出Hello world如下: #include<iostream>using namespace std;in ...
- Hackintosh相关资源站
猫叔博客 https://www.maoshu.cc/ 大神RehabMan https://bitbucket.org/RehabMan/ dsdt/ssdt打补丁译文 https://blog.c ...
- Python读取execl表格
读取execl表格 import xlrd Execl = xlrd.open_workbook(r'Z:\Python学习\python26期视频\day76(allure参数.读excel.发邮件 ...
- jQuery---版本问题
jQuery的版本 官网下载地址:http://jquery.com/download/ jQuery版本有很多,分为1.x 2.x 3.x 大版本分类: 1.x版本:能够兼容IE678浏览器 2.x ...