`
daojin
  • 浏览: 690200 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

自己写的share_ptr

 
阅读更多
#pragma once

namespace WSBoost
{
	template<class T> class shared_ptr
	{
	private:
		typedef int count_type;
	public:
		explicit shared_ptr(T * p = 0): px(p)
		{
			pn = new count_type(1);
		}
		~shared_ptr()
		{
			if(--*pn == 0)
			{
				delete px;
				delete pn;
			}
		}
		shared_ptr(shared_ptr const & r): px(r.px), pn(r.pn)
		{
			++*pn;
		}
		shared_ptr & operator=(shared_ptr const & r)
		{
			if (this != &r)
			{
				pn = r.pn;
				px = r.px;
				++ *pn;
			}
			return *this;
		}
	private:
		T * px; 
		count_type * pn;
	};
}

  

 另外一个版本的CSTring 和 share_ptr

 

#include "MyStudyFile.h"
#include <crtdbg.h>
#include <boost/smart_ptr/shared_ptr.hpp>
int  strlength (const char * str)
{
	const char *eos = str;
	while( *eos++ ) ;
	return( eos - str - 1 );
}
char *  strcapend (char * dst,const char * src)
{
	char * cp = dst;
	while( *cp )cp++;
	while( *cp++ = *src++ ) ;
	return( dst );
}
char * __cdecl strcopy(char * dst, const char * src)
{
	char * cp = dst;
	while( *cp++ = *src++ );
	return( dst );
}


//共享的实现。
template<class T>
class ShareDataImp
{
	typedef T ElementType;

private:
	struct SharedData
	{
		SharedData(ElementType* p = NULL):m_p(p), nRef(1)
		{
		}
		void AddRef()
		{
			++ nRef;
		}
		void Release()
		{
			if (-- nRef == 0)
			{
				delete[] m_p;
				m_p = NULL;
			}
		}
		ElementType* GetPtr()
		{
			return m_p;
		}
		int GetCount()
		{
			return nRef;
		}
	private:
		ElementType* m_p;
		int nRef;
	};

public:
	ShareDataImp(ElementType* pstr = NULL) 
		: m_pData(new SharedData(pstr))
	{
	}
	~ShareDataImp()
	{
		m_pData->Release();

		if (m_pData->GetCount() == 0)
		{
			delete m_pData;
		}

		m_pData = NULL;
	}
	ShareDataImp(const ShareDataImp& _right)
		: m_pData(_right.m_pData)
	{
		m_pData->AddRef();
	}
	//释放对共享数据的所有权。
	void ResetAs(ElementType* p)
	{
		m_pData->Release();

		delete m_pData;

		m_pData = new SharedData(p);
	}
	char* Get() const
	{
		return m_pData->GetPtr();
	}
private:
	SharedData* m_pData;
};


class CString
{
public:
	CString(char* pStr)
	{
		char* pNewStr = new char[strlength(pStr) + 1];

		strcopy(pNewStr, pStr);

		m_shareData.ResetAs(pNewStr);
	}
	~CString()
	{
	}
	const char* cstr() const
	{ 
		return m_shareData.Get();
	}

	CString& Append(CString& strVal)
	{
		CString strRight(strVal.cstr());

		m_shareData.ResetAs(CloneData(GetLength() + strVal.GetLength() + 1));

		strcapend(cstr(), strRight.cstr());

		return *this;
	}

	CString& Assign(const CString& strVal)
	{
		m_shareData.ResetAs(strVal.CloneData(strVal.GetLength() + 1));

		return *this;
	}

	CString& Assign(char* pStr)
	{
		CString strRight(pStr);

		m_shareData.ResetAs(strRight.cstr());

		return *this;
	}

	int GetLength() const
	{
		return strlength(m_shareData.Get());
	}
	
private:
	char* cstr()
	{
		return  m_shareData.Get();
	}

	char* CloneData(int iSize) const
	{
		char* pStr = new char[ iSize];

		strcopy(pStr, cstr());

		return pStr;
	}

	ShareDataImp<char> m_shareData;
};
int main()
{
	CString* pVal = new  CString("1");
	CString* pVa2 = new  CString(*pVal);
	CString* pVa3 = new  CString(*pVa2);
	CString* pVa4 = new  CString(*pVa3);
	delete pVal;
	delete pVa2;
	delete pVa3;
	delete pVa4;
	_CrtDumpMemoryLeaks();
}

 

0
0
分享到:
评论

相关推荐

    test_share_ptr

    在本项目"test_share_ptr"中,我们可以推断其主要关注的是C++中的智能指针`std::shared_ptr`。`std::shared_ptr`是C++标准库中的一个智能指针类型,属于弱所有者(weak ownership)的智能指针,用于管理动态分配的...

    采用引用计数的智能指针share_ptr

    采用引用计数的智能指针share_ptr,可以用于标准库容器

    shared_ptr

    shared_ptr boost audio video AVDataPool

    C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)

    shared_ptr基本用法 shared_ptr采用引用计数的方式管理所指向的对象。当有一个新的shared_ptr指向同一个对象时(复制shared_ptr等),引用计数加1。当shared_ptr离开作用域时,引用计数减1。当引用计数为0时,释放所...

    c++ shared_ptr智能指针使用注意事项

    shared_ptr在boost中地位...  1、share_ptr是一个类,它产生的是一个类对象,而不是一个原生的指针对象,但是为了减少类对象与针对对象使用的差异性,所以share_ptr类故意重载了两种常见的指针操作符: *和-&gt;。从而sha

    C++智能指针shared_ptr分析

    C++智能指针shared_ptr分析 概要: shared_ptr是c++智能指针中适用场景多,功能实现较多的智能指针。它采取引用计数的方法来实现释放指针所指向的资源。下面是我代码实现的基本功能。 实例代码: template class ...

    C++ 中boost::share_ptr智能指针的使用方法

    C++ 中boost::share_ptr智能指针的使用方法 Boost 库的智能指针是 C++ 编程中的一种重要工具,它能够自动管理内存的释放,减少了程序员的负担。其中,boost::shared_ptr 是一种常用的智能指针,它能够使 C++ 的开发...

    C++11 std::shared_ptr总结与使用示例代码详解

    最近看代码,智能指针用的比较多,自己平时用的少,周末自己总结总结。方便后续使用。 std::shared_ptr大概总结有以下几点: (1) 智能指针主要的用途就是方便资源的管理,自动释放没有指针引用的资源。 (2) 使用引用...

    浅析Boost智能指针:scoped_ptr shared_ptr weak_ptr

    scoped_ptrboost::scoped_ptr和std::auto_ptr非常类似,是一个简单的智能指针,它能够保证在离开作用域后对象被自动释放。下列代码演示了该指针的基本应用: 代码如下:#include &lt;string&gt;#include &lt;iostream&gt;#...

    C++11 智能指针之shared_ptr代码详解

    `shared_ptr` 允许多个指针同时拥有对同一对象的所有权,当最后一个`shared_ptr` 被销毁时,对象也会随之被删除。 `shared_ptr` 的基本用法通常涉及以下几个方面: 1. **创建 shared_ptr 实例** - **使用 `make_...

    shared_ptr线程安全性全面分析

    本文基于shared_ptr的源代码,提取了shared_ptr的类图和对象图,然后分析了shared_ptr如何保证文档所宣称的线程安全性。本文的分析基于boost 1.52版本,编译器是VC 2010。 shared_ptr的线程安全性boost官方文档对...

    详解C++中shared_ptr的使用教程

    shared_ptr是一种智能指针(smart pointer)。shared_ptr的作用有如同指针,但会记录有多少个shared_ptrs共同指向一个对象。 这便是所谓的引用计数(reference counting)。一旦最后一个这样的指针被销毁,也就是...

    代理模式+智能指针SharePtr代码

    在这个“SharePtr”的实现中,可能包含了自定义的智能指针类,它模仿了`std::shared_ptr`的行为,但可能具有特定的增强功能或适应了代理模式的需求。例如,智能指针可能被用作代理类的一部分,以确保在代理生命周期...

    Effective Modern C++ 之 shared_ptr

    我们前面介绍了unique_ptr智能指针,它对它所指向的对象资源具有专属所有权。这个就直接导致unique_ptr是无法进行复制操作的。有没有一种智能指针对象资源不具有专属所有权,也就是它可以进行复制操作。当然有的。那...

    【C++ 深入浅出】智能指针shared_ptr、unique_ptr、weak_ptr详解

    C++ 11中最常用的智能指针类型为shared_ptr,它采用引用计数的方法,记录当前内存资源被多少个智能指针引用。该引用计数的内存在堆上分配。当新增一个时引用计数加1,当过期时引用计数减一。只有引用计数为0时,智能...

    Boost智能指针

    boost::shared_ptr&lt;test&gt; sharePtr_2 = weakPtr.lock(); if (sharePtr_2) { sharePtr_2-&gt;print(); } return 0; } ``` 5. **`shared_array&lt;T&gt;` 和 `scoped_array&lt;T&gt;`** - **定义**:这两种智能指针专门用于...

Global site tag (gtag.js) - Google Analytics