目录
一、C++参考文档
二、仿写代码
namespace lwc{
template<class _Ty>
class My_Auto_ptr {
private:
bool _Owns;
_Ty* _Ptr;
public:
//改变对象名称
typedef _Ty element_type;
//构造函数
My_Auto_ptr(_Ty* _ptr=0):_Owns(_ptr!=0),_Ptr(_ptr) {}
//拷贝赋值皮在拷贝构造或赋值操作时,我们必须作特殊的处理来保证这个特性。auto_ _ptr
//的做法是"所有权转移”,即拷贝或赋值的源对象将失去对"裸”指针的所有权,所以,与一般拷贝构造函数,赋值函数不同,auto_ptr 的拷贝构造函数,赋值函数的参数为引用用而不是常引用(const reference)。
My_Auto_ptr(const My_Auto_ptr<_Ty>& _Y) :_Owns(_Y._Owns), _Ptr(_Y._Ptr) {}
//赋值函数
My_Auto_ptr<_Ty>& operator=(const My_Auto_ptr<_Ty>& _Y) {
if (this != &_Y) {
if (_Ptr != _Y._Ptr) {
if (_Owns) {
delete _Ptr;
}
_Owns = _Y._Owns;
}
else if (_Y._Owns) {
_Owns = true;
}
_Ptr = _Y.release();
}
return (*this);
}
//析构函数
~My_Auto_ptr() {
if (_Owns) {
delete _Ptr;
}
_Ptr = NULL;
}
//取对象
_Ty& operator*()const {
return (*_Ptr);
}
//去指针
_Ty* operator->()const {
return _Ptr;
}
_Ty* get()const {
return _Ptr;
}
_Ty* realease()const {
((My_Auto_ptr<_Ty>*)this)->_Owns = false;
return _Ptr;
}
};
}
三、Auto_Ptr遇到的问题
1、因为auto_ptr析构的时候肯定会删除他所拥有的那个对象,所以我们就要注意了,一个萝卜一个坑,两个auto_ptr 不能同时拥有同一个对象。像这样:
因为ap1与ap2都认为指针p是归它管的,在析构时都试图删除p,两次删除同一个对象的行为在
C++标准中是未定义的。所以我们必须防止这样使用auto_ ptr。
2、因为auto_ptr 的析构函数中删除指针用的是delete,而不是delete [],所以我们不应该用auto_ ptr 来管理一个数组指针。
3、构造函数的explicit 关键词有效阻止从一个裸指针隐式转换成auto_ ptr 类型。
4、因为auto_ ptr不具有值语义(value semantics),所以auto_ ptr不能被用在stl标准容器中。