auto_prt的VS版本源码剖析
通过对VC版本的auto_ptr的源代码得知VC版本还有一点小缺陷,又对VS版本的auto_ptr做了一些剖析,具体代码和注释如下:
//假设全局pa2都是用pa1来构造
//如:pa2(pa1)、pa2=pa1 template<class _Ty> //auto_ptr类声明
class auto_ptr; template<class _Ty>
struct auto_ptr_ref //auto_ptr的辅助类
{
explicit auto_ptr_ref(_Ty *_Right): _Ref(_Right)
{}
_Ty *_Ref;
}; template<class _Ty>
class auto_ptr//auto_ptr类
{
public:
typedef auto_ptr<_Ty> _Myt; //管理类的类型
typedef _Ty element_type; //被管理元素的类型 explicit auto_ptr(_Ty *_Ptr = ) : _Myptr(_Ptr) //构造
{} //从原始指针中获取控制权 //若pa2(pa1);
auto_ptr(_Myt& _Right) : _Myptr(_Right.release()) //拷贝构造
{} //若:pa2(pa1)
auto_ptr(auto_ptr_ref<_Ty> _Right)
{
// 用右值来构造
_Ty *_Ptr = _Right._Ref; //将pa1的指针保存在Ptr中
_Right._Ref = ; // 将pa1的指针指向空
_Myptr = _Ptr; // 将pa2的地址指向pa1的地址
} template<class _Other>
operator auto_ptr<_Other>() //转换为可转换的类型
{
return (auto_ptr<_Other>(*this));
} template<class _Other>
operator auto_ptr_ref<_Other>() //隐式类型转换,将auto_ptr类型指针转换为auto_ptr_ref类型
{
_Other *_Cvtptr = _Myptr;
auto_ptr_ref<_Other> _Ans(_Cvtptr);
_Myptr = ;
return (_Ans);
} template<class _Other>
_Myt& operator=(auto_ptr<_Other>& _Right) //针对可转换为 _Ty* 类型的 _Other* 类型的拷贝函数
{
reset(_Right.release());
return (*this);
} template<class _Other> //特定类型构造函数
auto_ptr(auto_ptr<_Other>& _Right) : _Myptr(_Right.release())
{} //针对可转换为 _Ty* 类型的 _Other* 类型的构造函数 //若:pa2=pa1
_Myt& operator=(_Myt& _Right) //拷贝赋值函数
{
reset(_Right.release());
return (*this);
} //若:pa2=pa1
_Myt& operator=(auto_ptr_ref<_Ty> _Right) //将一个 auto_ptr_ref 类型的变量赋值给 *this
{
_Ty *_Ptr = _Right._Ref; //将pa1的Ref指针赋值给pa2的_Ptr指针
_Right._Ref = ; // 将pa1的Ref指针指向空
reset(_Ptr); // 将pa2的_Myptr指向pa1
return (*this);
} ~auto_ptr() //析构
{
delete _Myptr; //析构指针所指向的内容
} _Ty& operator*() const //重载*
{
if (_Myptr == )
{
_DEBUG_ERROR("auto_ptr not dereferencable");
}
return (*get());
} _Ty *operator->() const //重载->
{
return (get());
} _Ty *get() const //用来返回_Myptr的地址
{
return (_Myptr);
} _Ty *release() //将一个对象的_Myptr记住,再指向空,然后再把其记住的地址返回
{
_Ty *_Tmp = _Myptr; //先将pa1的指针用Tmp保存,
_Myptr = ; //再讲pa1的指针指向空
return (_Tmp); // 返回Tmp即原来pa1指向的地址
} void reset(_Ty *_Ptr = ) //将this的_Myptr指向传进来的指针的地址
{
if (_Ptr != _Myptr) //如果pa1“以前的”(pa1在release()中被指向空,就是返回的那个Tmp用来记住pa1以前的那个地址)那个地址所指向的地址不等于pa2的地址
delete _Myptr; //先析构pa2所指向的地址 _Myptr = _Ptr; //再将pa2地址指向返回来的pa1的老地址
} private:
_Ty *_Myptr;
};
测试代码:
int main(int argc, char* argv[])
{
auto_ptr<int> pa(new int());
auto_ptr<int>pa1(pa);
cout << *pa1<<endl;
auto_ptr<int> pa2;
pa2 = pa1;
cout << *pa2 << endl;
auto_ptr_ref<int> par1(new int());
auto_ptr<int> pa3(par1);
cout << *pa3 << endl;
return ;
}
运行结果:
10
10
20
auto_prt的VS版本源码剖析的更多相关文章
- auto_ptr的VC版本源码剖析
auto_ptr是当前C++标准库(STL)中提供的一种智能指针,包含于头文件 #include<memory> .auto_ptr 能够方便的管理单个堆内存对象,在你不用的时候自动帮你释 ...
- 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& ...
随机推荐
- 将Python模块转变为命令行工具
问:如何输入命令行就能执行python代码呢? 答:要将python模块转变为命令行工具只用在 setup.py 文件中添加参数entry_points 例如: entry_points={ 'con ...
- Educational Codeforces Round 81 (Rated for Div. 2) 题解
过了n天补的题解:D AB就不用说了 C. Obtain The String 思路挺简单的,就是贪心,但是直接贪心的复杂度是O(|s|*|t|),会超时,所以需要用到序列自动机 虽然名字很高端但是就 ...
- 事件&vue修饰符
JavaScript 事件 HTML事件是发生在HTML元素上的事情.当在HTML页面帐使用JavaScript时,javascript可以触发这些事件 HTML 事件 HTML事件可以是浏览器的行为 ...
- Initialization of bean failed; nested exception is java.lang.NoClassDefFoundError: org/objectweb/asm/Type
问题描述 将项目挂载到 Myeclipse 的 tomcat 上,启动 tomcat ,报错“Initialization of bean failed; nested exception is ja ...
- JavaWeb学习(三) : 如何在 Eclipse 中创建一个Web 项目并成功运行?
前置条件 : 1.确保已安装 Eclipse.Tomcat 服务器安装包 2.jdk.环境变量都已配置成功. 3.注意在安装 Eclipse 时一定要选择第二个有 Web 项目的进行安装, 不然安装成 ...
- 二分-G - 4 Values whose Sum is 0
G - 4 Values whose Sum is 0 The SUM problem can be formulated as follows: given four lists A, B, C, ...
- web前端技术阅读
2015年 <响应式web设计>--响应式布局,渐进增强,优雅降级 <javascript高级程序设计>--js基础 2016年 <javascript语言精粹>- ...
- 2.restEasy中@PathParam和@QueryParam的区别
例如代码: @GET @Path("/{id}") @Produces(MediaType.APPLICATION_JSON) public T query(@PathParam( ...
- Java上转型和下转型
Java 转型问题其实并不复杂,只要记住一句话:父类引用指向子类对象. 什么叫父类引用指向子类对象,且听我慢慢道来. 从2个名词开始说起:向上转型(upcasting) .向下转型(downcasti ...
- KindEditor 编辑器前台得使用规范
官方网址:http://www.kindsoft.net/下载网址:http://www.kindsoft.net/down.php 引入得脚本: <link href="~/Cont ...