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& ...
随机推荐
- 文件包含漏洞(DVWA环境中复现)
LOW: 源代码: <?php // The page we wish to display $file = $_GET[ 'page' ]; ?> 可以看到,low级别的代码对包含的文件 ...
- Alice and Hairdresser
Alice's hair is growing by leaps and bounds. Maybe the cause of it is the excess of vitamins, or may ...
- Oracle 数据库,远程访问 ora-12541:TNS:无监听程序
1.修改网络连接IPV4设置为固定IP IP地址:192.168.100.8子网掩码:255.255.255.0默认网关:192.168.100.1首选DNS:192.168.100.1 2.修改.. ...
- 网页出现横向滚动条的原因可能是使用bootstrap不当引起
Bootstrap的栅格布局超级方便我们写网页.但是在不是全体配合使用的情况下,会出现横向滚动条的现象. 什么叫不是配合使用的情况呢? >>一种情况是:你使用了row作为你的第一层父元素: ...
- (转) maven snapshot和release版本的区别
在使用maven过程中,我们在开发阶段经常性的会有很多公共库处于不稳定状态,随时需要修改并发布,可能一天就要发布一次,遇到bug时,甚至一 天要发布N次.我们知道,maven的依赖管理是基于版本管理的 ...
- Oracle监听出现的问题总结,以及解决办法
包括的错误类型: 1.ORA-12541: TNS: 无监听程序 2. ORA-12514: TNS: 监听程序当前无法识别连接描述符中请求的服务 3.ORA-12560: TNS: 协议适配器错误 ...
- Harvard's CS50
最近看了哈佛大学David主讲的计算机科学入门,给我一个最大的感受是计算机编程语言真的不重要,重要的是编程者的思想. 1.同一个问题可以就Scratch解决,也可以用C,用Python,用JavaSc ...
- Chrome 提标 您的浏览器限制了第三方Cookie...解决方法
最近升级Chrome后会出现 您的浏览器限制了第三方Cookie,这将影响您正常登录,您可以更改浏览器的隐私设置,解除限制后重试. 解决方法: chrome://flags/ 把这句复制到浏览器回车 ...
- python:文件读写
#!/usr/bin/python# -*- coding:utf-8 -*- #!/usr/bin/python# -*- coding:utf-8 -*- file1 = open('a.txt' ...
- 并查集路径减半优化 UnionFind PathHalving (C++)
/* * UnionFind.h * 有两种实现方式,QuickFind和QuickUnion * QuickFind: * 查找O(1) * 合并O(n) * QuickUnion:(建议使用) * ...