auto_ptr指针虽然已经被抛弃不再使用,但他是unique_prt和share_ptr指针的基础,通过自己写的自动指针类,就可以清楚的知道auto_ptr的使用方法,以及它有什么不足之处,为什么会被抛弃。
废话不说,看代码就可以明白:
#include <iostream>
using namespace std;
template <class T>
class MyAutoPtr
{
public:
MyAutoPtr() : m_obj(nullptr) {}
MyAutoPtr(T* data) : m_obj(data) {}
MyAutoPtr(MyAutoPtr& other) :m_obj(other.release()) {} //拷贝构造函数
~MyAutoPtr() //在析构函数中delete对象
{
if (m_obj != nullptr)
{
delete m_obj;
}
}
T* get()
{
return m_obj;
}
T* release()
{
auto obj = m_obj;
m_obj = nullptr;
return obj;
}
void reset(T* obj = nullptr) {
if (m_obj != obj) {
delete m_obj;
m_obj = obj;
}
}
MyAutoPtr& operator = (MyAutoPtr& other)
{
if (this == &other)
{
return *this;
}
m_obj = other.release();
return *this;
}
T* operator->() //重载运算符->
{
return m_obj;
}
T* operator*() //重载运算符*
{
return *m_obj;
}
private:
T* m_obj;
};
class MyClass
{
public:
MyClass() = default;
~MyClass()
{
cout << "MyClass is deleted" << endl;
}
void Print()
{
cout << "Hello " << m_name <<", welcome to my world!" << endl;
}
void SetName(string name)
{
m_name = name;
}
private:
string m_name;
};
int main()
{
auto p = new MyClass();
MyAutoPtr<MyClass> sp(p);
sp->SetName("CSDN");
sp->Print();
MyAutoPtr<MyClass> sp2(sp); //MyClass的对象指针所有权从sp转移到sp2, sp不能再调用MyClass的函数。
sp2->Print();
//sp->Print(); //sp已经失去MyClass对象指针所有权,这个语句会导致程序崩溃。
return 0;
}
从代码可以看出,auto_ptr只支持拷贝构造函数,并在拷贝构造函数中完成了对象指针所有权的转移。也就是说,一个对象指针只能被一个智能指针所拥有,这个和auto_prt是一样的。
auto_ptr的缺点是:一个对象指针不能被多个智能指针对象所拥有,限制了其应用范围。share_ptr则避免了这个缺点。