atuo_ptr 实现

今天看了一下Standard C++有关auto_ptr的介绍,感觉那个结构不清晰,直接看源码

 

 

从代码中可以看出

1. auto_ptr可以辅助我们管理内存

2. auto_ptr在‘复制’的时候,管理权会放弃

3. auto_ptr_ref的引入 巧妙解决了右值引用的问题。

 

对于第3点,详细说明一下

在标准C++中 右值引用时不可以的。比如:

如果有函数 int f(void);

我们采用: int &p =f(void);这样的方式,在标准C++中是不允许的

必须要        const int &p = f(void); //之所以要说是标准C++ 因为在Vc中是支持的。呵呵

从源代码上可以看出 auto_ptr的拷贝构造函数“不是”我们常看见的 auto_ptr(const atuo_ptr<T> &p);

而是设计为 auto_ptr(atuo_ptr<T> p)这样的样式(原因是在这个拷贝构造函数中,对于传入的参数我们必须使其放弃管理权)

在这种设计下:我们就不能写这样的函数 atuo_ptr p( f(void) )

所以引入了auto_ptr_ref这个辅助结构来帮助我们的auto_ptr可以执行这样的函数 atuo_ptr p( f(void));

具体步骤为:

===============================================================================

auto_ptr<int> p(auto_ptr<int>(new int(0)))

便可以成功,过程如下:

1. 构造临时对象 auto_ptr<int>(new int(0))

2. 想将临时对象通过拷贝构造函数传给p,却发现没有合适的拷贝构造函数,因为只有auto_ptr(auto_ptr& rhs)这个不能用,又没有auto_ptr(const auto_ptr& rhs) (因为用了在所有权转移中会出错),呵呵!

3. 编译器只能曲线救国,看看类型转换后能不能传递。

4. 由于我们定义了 operator auto_ptr_ref() 所以编译器自然就可以试一下转为 auto_ptr_ref类型。

5. 编译器猛然间发现,我们定义了 auto_ptr(auto_ptr_ref rhs):ap(rhs.p){} 的构造函数,可以传递。

6. 顺利构造p,任务完成。

上面引用 http://blog.csdn.net/benny5609/archive/2008/06/06/2516822.aspx 的描述。

===============================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值