C++智能指针(1)—— auto_ptr
首先声明:auto_ptr已经废弃,C11标准里面新引入了其他智能指针,在下一期进行介绍。
1、什么是RAII:
是C++语言的一种资源管理,避免泄露的方法。对堆上空间进行自动化管理——利用对象自动析构的机制
2、auto_ptr
智能指针不能使用同一个裸指针赋值,也不能初始化多个auto_ptr
void text01()
{
int* p = new int(10);
auto_ptr<int> a_p(p);//a_p在栈上,会自动析构,同时就将p也给析构
auto_ptr<int> a_p1(p);
cout << *p << endl;
cout << *a_p << endl;
cout << *a_p1 << endl;
}
int main()
{
text01();
return 0;
}
上述代码使用同一个裸指针初始化了两个auto_ptr,就会导致运行的时候程序崩溃。
void text02()
{
int* p = new int(10);
auto_ptr<int> a_p(p);
auto_ptr<int>a_p2 = a_p;//等号运算符重载,会将a_p这个原智能指针置空
cout << *a_p << endl;//a_p已经置空了,就无法进行输出,所以再输出就会导致程序崩溃
}
int main()
{
text02();
return 0;
}
上述代码使用同一个裸指针赋值,在输出的时候也会导致程序崩溃
原因:
拷贝构造和等号运算符会将原智能指针置空。
3、auto_ptr不支持隐式构造
void text03()
{
int* p = new int(10);
auto_ptr<int> a_p= auto_ptr<int>(p);
/*
p生成临时auto_ptr对象——隐式构造
使用临时对象拷贝构造a_p
析构临时对象
——被优化 直接构造a_p
*/
}
4、auto_ptr的部分源码
template <typename T>
class Mauto_ptr
{
public:
//构造
explicit Mauto_ptr(T* ptr=nullptr)
:_ptr(ptr)//explicit用来防止隐式构造
{
}
//拷贝构造
Mauto_ptr(Mauto_ptr& src)
:_ptr(src.release())
{
}
//等号运算符重载
Mauto_ptr operator=(const Mauto_ptr& src)
{
_ptr = src.release();
}
~Mauto_ptr()
{
delete _ptr;
}
T* release()
{
T* tmp = _ptr;
_ptr = nullptr;
return tmp;
}
void reset()
{
delete _ptr;
_ptr = nullptr;
}
T& operator*()
{
return *_ptr;
}
T* operator->()
{
return _ptr;
}
private:
T* _ptr;
};