スマートポインタweak_ptrのコアソース実装

3639 ワード

Weakptrは弱い参照ポインタとしてcounterに依存するカウンタクラスとshare_を実現するptrの付与、構造なのでcounterとshare_ptrも簡単に実現します.
counterオブジェクトの宛先は、参照基数を格納するためにブロックメモリを申請するために使用され、以下のように簡単に実現されます.
class Counter
{
	public:
		Counter():s(0),w(0){};
		int s;
		int w;
};

sはshare_ptrの参照カウント、wはweak_ptrの参照カウントは、wが0の場合、Counterオブジェクトを削除します.
share_ptrの簡単な実現は以下の通りである.
template class WeakPtr;//   weak_ptr lock(),   share_ptr ,       
template
class SharePtr
{
    public:
        SharePtr(T* p=0)
        :_ptr(p){
            cnt=new Counter();
            if(p)
	       cnt->s=1;
            cout<s< const &s)
        {
            cout<s++;
            cout<s< const &w)//   weak_ptr lock(),   share_ptr ,       
	{
		cout<s++;
                cout<s<& operator=(SharePtr &s)
        {
            if(this != &s)
            {
                release();
                (s.cnt)->s++;
                cout<s<()
        {
            return _ptr;
        }
	friend class WeakPtr; //  weak_ptr share_ptr         。
    private:
        void release()
        {
            cnt->s--;
            cout<s<s <1)
            {
               delete _ptr;
	       if(cnt->w <1)
	       {
			delete cnt;
			cnt=NULL;
		}
	     }
        }
        T* _ptr;
        Counter* cnt;
};
share_ptrの与えられた関数インタフェースは,構造,コピー構造,付与値,解参照である.releaseで参照カウントが0のときに削除_ptrとcntのメモリ.
最後にweak_を与えることができますptrの実装は、以下の通りである.
template
class WeakPtr
{
	public://           ,                  
		  WeakPtr()
		{
			 _ptr=0;
			cnt=0;
		}
		WeakPtr(SharePtr& s):
			_ptr(s._ptr),cnt(s.cnt)
		{
			cout<w++;
		}
		WeakPtr(WeakPtr& w):
			_ptr(w._ptr),cnt(w.cnt)
		{
			cnt->w++;
		}
		~WeakPtr()
		{
			release();	
		}
		WeakPtr& operator =(WeakPtr & w)
		{
			if(this != &w)
			{
				release();
				cnt=w.cnt;
				cnt->w++;
				_ptr=w._ptr;
			}
			return *this;
		}
		WeakPtr& operator =(SharePtr & s)
		{
			cout<w++;
			_ptr=s._ptr;
			return *this;
		}
		SharePtr lock()
		{
			return SharePtr(*this);
		}
		bool expired()
		{
			if(cnt)
			{
				if(cnt->s >0)
				{
					cout<s<;//  weak_ptr share_ptr         。
	private:
		void release()
		{
			if(cnt)
			{
				cnt->w--;
				cout<w<w <1&& cnt->s <1)
				{
					//delete cnt;
					cnt=NULL;
				}
			}
		}
		T* _ptr;
		Counter* cnt;
};

share_ptrの一般的なインタフェースはshare_を介してptrを構築し、expired関数で元のポインタが空であるかどうかをチェックし、lockでshare_に変換します.ptr.
テストコードは次のとおりです.
class parent;
class child;
class parent
{
    public:
       // SharePtr ch;
       WeakPtr ch;
};
class child
{
    public:
        SharePtr pt;
};
int main()
{
    //SharePtr ft(new parent());
    //SharePtr son(new child());
    //ft->ch=son;
    //son->pt=ft;
	//SharePtr son2=(ft->ch).lock();
	SharePtr i;
	WeakPtr wi(i);
	cout<
コメントを開くことでshare_をシミュレートできますptrの古典的なループリファレンスの例は、ポインタが空であるかどうかを確認することもできます.
完全なコードはiostreamヘッダファイルとstdのnamespaceを加えてコンパイルして実行できます.