STL 智能指针

15 篇文章 0 订阅
智能指针是用来管理用new分配的内存的指针,他的定义如下:


// TEMPLATE CLASS auto_ptr
template<class _Ty>
class auto_ptr {
public:
typedef _Ty element_type;
explicit auto_ptr(_Ty *_P = 0) _THROW0()
: _Owns(_P != 0), _Ptr(_P) {}
auto_ptr(const auto_ptr<_Ty>& _Y) _THROW0()
: _Owns(_Y._Owns), _Ptr(_Y.release()) {}
auto_ptr<_Ty>& operator=(const auto_ptr<_Ty>& _Y) _THROW0()
{if (this != &_Y)
{if (_Ptr != _Y.get())
{if (_Owns)
delete _Ptr;
_Owns = _Y._Owns; }
else if (_Y._Owns)
_Owns = true;
_Ptr = _Y.release(); }
return (*this); }
~auto_ptr()
{if (_Owns)
delete _Ptr; }
_Ty& operator*() const _THROW0()
{return (*get()); }
_Ty *operator->() const _THROW0()
{return (get()); }
_Ty *get() const _THROW0()
{return (_Ptr); }
_Ty *release() const _THROW0()
{((auto_ptr<_Ty> *)this)->_Owns = false;
return (_Ptr); }
private:
bool _Owns;
_Ty *_Ptr;
};




对于智能指针来说,因为管理着指针的释放工作,而当多个智能指针包装有同一个指针时,只有一个是拥有者.而只有指针的拥有者才能对指针进行释放。根据auto_ptr类的定义来看:


1.当调用构造函数构造一个指针时,智能指针就是这个指针的拥有者。而且默认构造函数将使得指针的值为NULL
2.当调用拷贝构造函数来建立一个智能指针时,目标对象将会继承源智能指针的所有权状态(不管是否有所有权)而且源智能指针将会释放其所有权
3.当调用赋值操作时,目标指针将会根据自己原来的状态释放掉自己所指的指针,而继承源智能指针的状态,而源将释放所有权
4.auto_ptr的 * ->都将返回的是其管理的指针,但因为要在容器中使用智能指针所以没有&
5.可以调用get函数来获取其管理的指针
6.release只是释放对指针的所有权,但并不表示不能继续使用指针了!(这里会有一定的危险,因为他不能预料指针何时是失效的.
7.在调用构造函数时不能将一个指针同时做两个智能指针的参数!
8.在以auto_ptr做为函数参数时要切记,因为参数传递后,栈上的智能指针拥有的所有权。所以当函数退出后指针将会被释放掉,
9.为了确保在使用智能指针时控制好智能指针,可以使用const auto_ptr<....>形式来定义一个智能指针
10.不能将一个智能指针作为标准容器的参数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值