SharedPtr

#pragma once

//
// 简单模拟最初版的shared_ptr的设计,这里不考虑线程安全和循环引用等问题。
//

namespace ONE
{
	template <class T>
	class SharedPtr
	{
	public :
		SharedPtr(T* ptr = NULL)
			: _ptr(ptr )
			, _countPtr(new int(1))
		{}     

		~ SharedPtr()
		{
			_Release();
		}

		SharedPtr(const SharedPtr<T>& ap)
			: _ptr(ap ._ptr)
			, _countPtr(ap ._countPtr)
		{
			++ _countPtr[0];
		}

		SharedPtr& operator =(const SharedPtr<T>& ap )
		{
			if (this != &ap)
			{
				this->_Release ();

				_ptr = ap ._ptr;
				_countPtr = ap ._countPtr;

				++ _countPtr[0];
			}

			return *this ;
		}

		T* GetPtr ()
		{
			return _ptr ;
		}

		int GetCount ()
		{
			return *_countPtr ;
		}

		T& operator * ()
		{
			return *_ptr ;
		}

		T* operator -> ()
		{
			return _ptr ;
		}

	protected :
		void _Release ()
		{
			if (--_countPtr [0] == 0)
			{
				delete _countPtr ;

				if (_ptr )
				{
					delete _ptr ;
				}
			}
		}

	private :
		T* _ptr ;
		int* _countPtr ;
	};

	void TestSharedPtr ()
	{
		SharedPtr<int > p1 = new int (1);
		cout<<"p1->count:" <<p1. GetCount()<<endl ;

		SharedPtr<int > p2 = p1;
		cout<<"p1->count:" <<p1. GetCount()<<" " ;
		cout<<"p2->count:" <<p2. GetCount()<<endl ;

		SharedPtr<int > p3;
		p3 = p2 ;
		cout<<"p1->count:" <<p1. GetCount()<<" " ;
		cout<<"p2->count:" <<p2. GetCount()<<" " ;
		cout<<"p3->count:" <<p3. GetCount()<<endl ;
	}


	template <class T>
	class SharedArray
	{
	public :
		SharedArray(T * ptr = NULL)
			: _ptr(ptr )
			, _countPtr(new int(1))
		{}

		~ SharedArray()
		{
			_Release();
		}

		SharedArray(const SharedArray<T>& ap)
			: _ptr(ap ._ptr)
			, _countPtr(ap ._countPtr)
		{
			++ _countPtr[0];
		}

		SharedArray& operator =(const SharedArray<T>& ap)
		{
			if (this != &ap)
			{
				this->_Release ();

				_ptr = ap ._ptr;
				_countPtr = ap ._countPtr;

				++ _countPtr[0];
			}

			return *this ;
		}

		T* Get()
		{
			return _ptr ;
		}

		int GetCount ()
		{
			return *_countPtr ;
		}

		T& operator [](size_t index)
		{
			return _ptr [index];
		}

	protected :
		void _Release ()
		{
			if (--_countPtr [0] == 0)
			{
				delete _countPtr ;

				if (_ptr )
				{
					delete[] _ptr ;
				}
			}
		}

	private :
		T* _ptr ;
		int* _countPtr ;
	};

	void TestSharedArray()
	{
		SharedArray<int > p1 = new int [20];
		cout<<"p1->count:" <<p1.GetCount()<<endl ;

		SharedArray<int > p2 = p1;
		cout<<"p1->count:" <<p1.GetCount()<<" " ;
		cout<<"p2->count:" <<p2.GetCount()<<endl ;

		SharedArray<int > p3;
		p3 = p2 ;
		cout<<"p1->count:" <<p1.GetCount()<<" " ;
		cout<<"p2->count:" <<p2.GetCount()<<" " ;
		cout<<"p3->count:" <<p3.GetCount()<<endl ;

		p1[1] = 1;
		p3[2] = 2;

		cout<<p1 [1]<<" "<< p1[2]<<endl ;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
shared_ptr是C++11引入的一种智能指针,用于管理动态分配的内存。它的主要用法是跟踪指向一个对象的所有共享指针,并在最后一个指针离开作用域时自动释放内存。 在使用shared_ptr时,首先需要包含<memory>头文件。我们可以使用make_shared函数来创建一个shared_ptr对象,并将其初始化为一个动态分配的对象。例如,shared_ptr<int> ptr = make_shared<int>(5); 创建了一个指向int类型的共享指针,并将其初始化为值为5的动态分配的对象。 可以使用“->”运算符访问shared_ptr指向的对象成员。例如,ptr->value()可以访问共享指针指向的对象的value()函数。 shared_ptr还可以通过调用get函数,将指向的原始指针作为返回值返回。例如,int* rawPtr = ptr.get(); 这样,我们就可以像使用原始指针一样使用rawPtr。 当需要获得与shared_ptr对象共享资源的指针个数时,可以使用use_count()函数。例如,int count = ptr.use_count(); 得到了shared_ptr对象当前的引用计数。 在使用shared_ptr时,当不需要再引用原始指针指向的对象时,可以将其置为null,即ptr = nullptr; 这样会减少引用计数,当计数为0时,shared_ptr会自动释放内存。 需要注意的是,shared_ptr的循环引用可能导致内存泄漏。这是因为当多个shared_ptr对象互相引用时,它们的引用计数都不会归零,从而导致对象的内存无法释放。为了避免循环引用,应该使用weak_ptr来替代其中一个shared_ptr,从而打破引用环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值