C++: 自己动手写一个类似std::auto_ptr的智能指针模板类

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则避免了这个缺点。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值