Boost库 --- 四种智能指针
智能指针基本思想:
智能指针:主要有Boost库中的智能指针和STL标准库中的智能指针构成
- auto_ptr
- unique_ptr(引入前在boost库中叫做scope_ptr)
- shared_ptr
- weak_ptr
其中auto_ptr为C++11标准之前拥有,但是auto_ptr问题很大,所以在C++11标准后引入了三种boost库中的智能指针unique_ptr,shared_ptr,以及weak_ptr
智能指针基本思想:手动开辟内存,然后让系统进行释放
我们一一来介绍:
所有智能指针编写代码时都需要注意的事:
- 智能指针编写的时候,因为不知道指向的是何种类型的堆内存,所以都写成模板形式
- 注意智能指针的构造以及析构函数的编写
- 注意拷贝构造函数以及赋值运算符的重载函数的编写,这里可能导致多个智能指针指向同一块堆内存,防止同一块内存被多次释放导致系统崩溃。
- 普通指针含有的功能,我们一般也要给智能指针加上,比如*解引用功能以及->指向功能
我们根据上面几点一一开始介绍:
①:auto_ptr
特点:管理权唯一,释放权也唯一(拷贝构造和赋值的方式,都会导致原有的指针失效)
缺点:
- 不能多个对象同时访问这个内存,所以我们可以给里面添加一个标志位flag进行优化
- 类似于链表中,由于所有权的转移,导致某些指针在预期失效前就失效了
- 最重要一点,auto_ptr不能管理对象数组,因为auto_ptr的析构函数中是delete而不是delete[],当然这里我们可以进行模板的特例化对其进行优化
auto_ptr代码如下:
/*
//加了标志位bool flag的版本
template<typename T>
class Smart_ptr
{
public:
Smart_ptr(T* ptr) :mptr(ptr)
{
flag = true;
}
Smart_ptr(const Smart_ptr<T>& rhs)
{
mptr = rhs.mptr;
flag = rhs.flag;
rhs.flag = false;
}
Smart_ptr<T>& operator= (const Smart_ptr<T>& rhs)
{
if(this != &rhs)
{
this->~Smart_ptr();//手动调用析构函数
mptr = rhs.mptr;
flag = rhs.flag;
rhs.flag = false;
}
return *this;
}
~Smart_ptr()
{
if(flag == true)
{
delete mptr;
}
mptr = NULL;
}
T& operator* ()
{
return *mptr;
}
T* operator-> ()
{
return mptr;
}
private:
T* mptr;
mutable bool flag;
};
*/
/*
//最初始版本
//auto_ptr 简化版
template <typename T>
class Smart_ptr
{
public:
Smart_ptr(T* ptr) :mptr(ptr){}
~Smart_ptr()
{
delete mptr;
mptr = NULL;
}
Smart_ptr