智能指针shared_ptr

sheared_ptr

#include <string>
#include <iostream>
 
using namespace std;
 
template <typename T>
class Sharedptr {
public:
	//空参数构造, 空指针
	Sharedptr():count(new size_t), ptr(nullptr){}
	//构造函数 count 必须new出来
	Sharedptr(T* p) : count(new size_t(1)), ptr(p){}
	//拷贝构造函数,使其引用次数加一
	Sharedptr(const Sharedptr<T>& other) : count(other.count), ptr(other.ptr){
		if (nullptr != ptr) {
			++(*count);
		}
	}
	//移动构造
	Sharedptr(const Sharedptr<T>&& other) : count(other.count), ptr(other.ptr) {
		++(*count);
	}
	//重载operator*和operator->实现指针功能
	T* operator->() { return ptr; }
	T& operator*() { return *ptr; }
	//重载bool
	operator bool() { return ptr == nullptr; }
	//重载operator =
	//如果原来的sharedptr已经有对象,则让其引用对象次数减一并判断引用是否为零(是否调用delete),然后将新的引用对象次数加一
	Sharedptr<T>& operator=(const Sharedptr<T>& other) {
		if (this == &other) return *this;
		++ *other.count;
		if (this->ptr && 0 == -- *this->count) {
			delete count;
			delete ptr;
			count = nullptr;
			ptr = nullptr;
			cout << "delete ptr =" << endl;
		}
		this->ptr = other.ptr;
		this->count = other.count;
		return *this;
	}
	T* get() { return ptr; }
	size_t use_count() { return *count; }
	bool unique() { return *count == 1; }
	//析构函数 使用引用次数减一并判断引用是否为零,即是否调用delete
	~Sharedptr() {
		if (ptr && -- * count == 0) {
			delete count;
			delete ptr;
			ptr = nullptr;
			count = nullptr;
			cout << "delete ptr ~" << endl;
		}
	}
private:
	size_t* count;
	T* ptr;
};
 
int main(int argc, const char* argv[]) {
	Sharedptr<string> pstr(new string("abc"));
	cout << "pstr:" << pstr.use_count() << " " << *pstr << endl;
	if (pstr) {
		cout << "pstr is not nullptr." << endl;
	}
 
	Sharedptr<string> pstr2(pstr);
	cout << "pstr:" << pstr.use_count() << " " << *pstr << endl;
	cout << "pstr2:" << pstr2.use_count() << " " << *pstr2 << endl;
 
	Sharedptr<string> pstr3(new string("hao"));
	cout << "pstr3:" << pstr3.use_count() << " " << *pstr3 << endl;
	
	pstr3 = pstr2;
	cout << "pstr:" << pstr.use_count() << " " << * pstr << endl;
	cout << "pstr2:" << pstr2.use_count() << " " << *pstr2 << endl;
	cout << "pstr3:" << pstr3.use_count() << " " << *pstr3 << endl;

	auto pstr4 = pstr3.get();
	cout << "pstr3:" << pstr3.use_count() << " " << *pstr4 << endl;
	cout << "pstr3->size(): " << pstr3->size() << endl;
	cout << "pstr3.size(): " << (*pstr3).size() << endl;
	return 0;	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值