1.什么是RALL
使用局部对象管理资源的技术,称为资源的获取即初始化。
利用了创建对象时调用构造函数获取资源,当销毁对象时调用析构函数释放资源。RALL更充分的是利用了局部对象,为什么使用局部对象呢?原因是,假如函数中存在一个对象,调用此函数对象被产生,函数结束会调用析构函数,对象被销毁。局部对象是由系统自动管理的
2.裸指针的缺点
裸指针:
直接拿类型定义的指针
裸指针带来的问题:
1.无法判断裸指针指向的是一个对象还是一组对象
2.裸指针只能判断是否为空指针,不能判断其是否为失效指针
3.无法判断一个裸指针是否被释放
3.auto_ptr为什么被C11移除
拿一个auto_ptr对象初始化另一个auto_ptr对象会调用拷贝构造函数,
原因一
但是调用拷贝构造函数的目的是什么呢?
1.是要求2个对象共享同一资源呢
带来的问题就是,由于2个对象共享同一资源,当主函数结束时pobjb会先将资源析构,当析构pobja时会对同一个内存空间第二次进行析构是错误的。
原因二
2.还是将一个对象pobja的资源转换给对象pobjb呢
带来的问题就是
原因三
因此使用的场景不明确,拷贝构造的目的不明确,因此C11移除了它;由于析构时指向不明确,所以STL的容器不和auto_ptr玩
4.源码
class Object
{
int value;
public:
Object(int x = 0) :value(x)
{
cout << "Create Object: " << this << endl;
}
~Object()
{
cout << "Destory Object: " << this << endl;
}
int& Value()
{
return value;
}
const int& Value()const
{
return value;
}
};
template<class _Ty>
class my_auto_ptr
{
private:
bool _Owns; //拥有权
_Ty* _Ptr; //指向的资源
public:
my_auto_ptr(_Ty*p=NULL):_Owns(p!=NULL),_Ptr(p){}
~my_auto_ptr()
{
if (_Owns)
{
delete _Ptr;
}
_Owns = false;
_Ptr = NULL;
}
_Ty& operator*()const//
{
return *_Ptr;
}
_Ty* operator->()const
{
return &**this;
}
void reset(_Ty* p)//重置
{
if (_Owns)
{
delete _Ptr;
}
_Ptr = p;
}
_Ty* release()const//释放
{
_Ty* tmp = NULL;
if (_Owns)
{
((my_auto_ptr*)this)->_Owns = false;
tmp = _Ptr;
((my_auto_ptr*)this)->_Ptr = NULL;
}
return tmp;
}
/*my_auto_ptr& operator=(const my_auto_ptr& _Y)
{
if (this == &_Y)return *this;
if (_Owns)
{
delete _Ptr;
}
_Owns = _Y._Owns;
_Ptr = _Y._Ptr;
return 0;
}*/
};
void fun()
{
my_auto_ptr<Object>obj(new Object(10));
cout << (*obj).Value() << endl;
cout << obj->Value() << endl;
}
int main()
{
my_auto_ptr<Object>pobja(new Object(10));
my_auto_ptr<Object>pobjb(pobja);
return 0;
}