有时候申请空间而没有释放,就会造成内存泄漏,因此有智能指针的出现。
一、智能指针auto_ptr(只需要进行申请new,而不需要delete,系统会自动对内存进行管理)
1.RALL:使用局部对象来管理资源的技术成为资源获取即初始化。(建立在栈上的技术)
如何让资源自动销毁,即利用RALL,利用局部对象自动销毁的特性来控制资源生命周期。
2.注意智能指针中.和->的区别
. 是对象自身的方法,->是指针存放的对象的属性和方法
也就是可以使用 pobja->Print() ,(*pobja).Print()
3.智能指针的拷贝构造
4.智能指针的拷贝函数
5.智能指针的重置函数和释放函数
void reset(_Ty *p = NULL) //重置函数,重置指向
{
if(_Owns) // _Ptr ->Object;
{
delete _Ptr;
}
_Ptr = p;
}
_Ty * release() const //释放函数,释放了指针,把原先拥有的指针返回,而自己已经没有了
{
_Ty *tmp = NULL;
if(_Owns)
{
//_Owns = false //舍弃
((auto_ptr<_Ty> *) this)->_Owns = false; //将this进行强转,消除其常性
tmp = _Ptr;
((auto_ptr<_Ty> *) this)->_Ptr = NULL;
}
return tmp;
}
6.auto_ptr出现的问题:
①会出现二义性,不知道是否转移拥有权还是共享拥有权。
②应用场景不明;
③无法释放连续的空间(一组空间);
④不能放入容器中使用
⑤还会出现数值问题。仅仅进行指针传递,第二个打印就编译不通过,丢失了拥有权。&#