手写shared_ptr智能指针

#include <string>
#include <iostream>

using namespace std;

template <typename T>
class Sharedptr {
public:
	//空参数构造, 空指针
	Sharedptr():count(0), ptr((T*) 0){}
	//构造函数 count 必须new出来
	Sharedptr(T* p) : count(new int(1)), ptr(p){}
	//拷贝构造函数,使其引用次数加一
	Sharedptr(Sharedptr<T>& other) : count(&(++ *other.count)), ptr(other.ptr){}
	//重载operator*和operator->实现指针功能
	T* operator->() { return ptr;}
	T& operator*() { return *ptr; }
	//重载operator =
	//如果原来的sharedptr已经有对象,则让其引用对象次数减一并判断引用是否为零(是否调用delete),然后将新的引用对象次数加一
	Sharedptr<T>& operator = (Sharedptr<T>& other) {
		if (this == &other) return *this;
		++* other.count;
		if (this->ptr && 0 == -- * this->count) {
			delete count;
			delete ptr;
			cout << "delete ptr =" << endl;
		}
		this->ptr = other.ptr;
		this->count = other.count;
		return *this;
	}
	//析构函数 使用引用次数减一并判断引用是否为零,即是否调用delete
	~Sharedptr() {
		if (ptr && -- * count == 0) {
			delete count;
			delete ptr;
			cout << "delete ptr ~" << endl;
		}
	}
	int getRef() {
		return *count;
	}
private:
	int* count;
	T* ptr;
};

int main(int argc, const char* argv[]) {
	Sharedptr<string> pstr(new string("abc"));
	cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;

	Sharedptr<string> pstr2(pstr);
	cout << "pstr:" << pstr.getRef() << " " << *pstr << endl;
	cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl;

	Sharedptr<string> pstr3(new string("hao"));
	cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;
	
	pstr3 = pstr2;
	cout << "pstr:" << pstr.getRef() << " " << * pstr << endl;
	cout << "pstr2:" << pstr2.getRef() << " " << *pstr2 << endl;
	cout << "pstr3:" << pstr3.getRef() << " " << *pstr3 << endl;

	return 0;
}

 

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

樱桃木

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值