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

自己写的share_ptr + Arry 来制作CString共享版本

 
阅读更多
#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>
void SwapFun(T& left, T& right)
{
	T temp = left;
	left = right;
	right = temp;
}
template<class T>
class CArry
{
	typedef T ELEMENT_TYPE;
public:
	CArry(const ELEMENT_TYPE* pChar, int nSize)
		:m_iMaxSize(nSize), m_iCurentSize(nSize)
	{
		m_pVChar = new ELEMENT_TYPE[m_iMaxSize];
		ELEMENT_TYPE* pStart = m_pVChar;
		while (nSize --)
		{
			*pStart++ = *pChar++;
		}
	}
	CArry(const ELEMENT_TYPE* pChar, int nSize, int nMaxSize)
		:m_iMaxSize(nMaxSize), m_iCurentSize(nSize)
	{
		m_pVChar = new ELEMENT_TYPE[m_iMaxSize];
		ELEMENT_TYPE* pStart = m_pVChar;
		while (nSize --)
		{
			*pStart++ = *pChar++;
		}
	}
	CArry& Append(const ELEMENT_TYPE* pChar, int nSize)
	{
		if (nSize + m_iCurentSize <= m_iMaxSize)
		{
			ELEMENT_TYPE* pStart = m_pVChar+ m_iCurentSize;
			while(nSize --)
			{
				*pStart++  = *pChar++;
			}
		}
		else
		{
			CArry(m_pVChar, m_iCurentSize, nSize + m_iCurentSize).Swap(this);
			Append(pChar, nSize);
		}
	}
	CArry& Assign(const int posAfter, ELEMENT_TYPE* pChar, int nSize)
	{
		ELEMENT_TYPE* pStart = m_pVChar + posAfter;
		while(nSize --)
		{
			*pStart++ = *pChar++;
		}
	}
	~CArry()
	{
		delete[] m_pVChar;
	}
	operator ELEMENT_TYPE*()
	{
		return m_pVChar;
	}
	int GetSize()
	{
		return m_iCurentSize;
	}
private:
	void Swap(CArry& other)
	{
		SwapFun(m_pVChar, other.m_pVChar) ;
		SwapFun(m_iMaxSize, other.m_iMaxSize);
		SwapFun(m_iCurentSize, other.m_iCurentSize);
	}
	ELEMENT_TYPE* m_pVChar;
	int m_iMaxSize;
	int m_iCurentSize;
};
//共享的实现。
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);
	}
	ElementType* Get() const
	{
		return m_pData->GetPtr();
	}
private:
	SharedData* m_pData;
};


class CString
{
public:
	CString(char* pStr)
	{
		CArry<char>* pArry = new CArry<char>(pStr, strlength(pStr) + 1);
		m_shareData.ResetAs(pArry);
	}
	~CString()
	{
	}
	const char* cstr() const
	{ 
		return *(m_shareData.Get());
	}

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

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

		m_shareData.Get()->Assign(GetLength(), strRight.cstr(), strRight.GetLength() + 1);

		return *this;
	}
	CString& Append(char* pChar, int iLength)
	{
		m_shareData.ResetAs(CloneData(GetLength() + iLength + 1));

		m_shareData.Get()->Assign(GetLength(), pChar, iLength + 1);
	}

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

		return *this;
	}

	CString& Assign(char* pStr)
	{	
		m_shareData.ResetAs(new CArry<char>(pStr, strlength(pStr) + 1));

		return *this;
	}

	int GetLength() const
	{
		return m_shareData.Get()->GetSize() - 1;
	}
	
private:
	char* cstr()
	{
		return  *(m_shareData.Get());
	}

	CArry<char>* CloneData(int iSize) const
	{
		return new CArry<char>(cstr(), GetLength() + 1, iSize);
	}

	ShareDataImp<CArry<char>> m_shareData;
};

int main()
{
	CString* pVal = new  CString("121312");
	CString* pVa2 = new  CString(*pVal);
	CString* pVa3 = new  CString(*pVa2);
	CString* pVa4 = new  CString(*pVa3);
	delete pVal;
	delete pVa2;
	delete pVa3;
	delete pVa4;
	_CrtDumpMemoryLeaks();
}

 

分享到:
评论

相关推荐

    test_share_ptr

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

    C++ unique_ptr weak_ptr shared_ptr auto_ptr智能指针.doc

    在 C++ 中,有四种智能指针:auto_ptr、unique_ptr、shared_ptr 和 weak_ptr,每种智能指针都有其特点和使用场景。 一、auto_ptr auto_ptr 是 C++98 中引入的智能指针,它可以自动释放动态分配的内存。但是,auto_...

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

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

    shared_from_this() in Constructor:直接替换std :: shared_ptr + std :: enable_shared_from_this-开源

    显然,许多人不喜欢标准std :: enable_... boost库也可以这样做,但是它不允许在析构函数中创建shared_ptrs,并且它不提供release()方法来获取所包含指针的所有权。 但是,不利的一面是,它还没有成为线程安全的。

    智能指针shared_ptr的Demo

    在`VS2015_CV_Demo`这个压缩包中,可能包含了一个使用`shared_ptr`的示例项目,你可以通过编译运行来观察`shared_ptr`如何工作。示例可能涉及到如何创建、传递和释放`shared_ptr`,以及在多线程环境中如何正确地使用...

    自己实现的auto_ptr

    标题中的“自己实现的auto_ptr”指的是用户自行编写的一个智能指针类,模仿了C++标准库中的`std::auto_ptr`。`std::auto_ptr`是C++标准库中的一个智能指针,用于管理动态分配的对象,它会在适当的时候自动删除所指向...

    com_ptr_t 的解析

    `_com_ptr_t`是Microsoft Visual C++运行库提供的一种智能指针,专为简化COM接口的使用而设计。 `_com_ptr_t`类模板封装了COM接口指针,并自动处理`AddRef`、`Release`和`QueryInterface`等方法的调用,这些是COM...

    C++ 智能指针(shared_ptr/weak_ptr)源码

    C++ 智能指针(shared_ptr/weak_ptr)源码 源码位置:gcc-6.1.0\gcc-6.1.0\libstdc++-v3\include\tr1 这里只单列shared_ptr.h文件用于分析

    一个最小的sharedunique_ptr实现来处理booststdsharedunique_ptr不可用的情况。.zip

    在某些情况下,可能由于库的限制或者特定环境不支持Boost或C++11及更高版本,导致无法使用标准库中的`std::shared_ptr`和`std::unique_ptr`。在这种场景下,就需要实现自己的智能指针,以达到类似的效果。标题所提及...

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

    `shared_ptr`适合需要多个智能指针共享同一对象的情况,`unique_ptr`适用于独占所有权的资源管理,而`weak_ptr`则解决了循环引用的问题。了解并正确使用这些智能指针,是提升C++编程质量的关键。

    auto_ptr指针介绍(智能指针).

    尽管在C++11及以后版本中引入了更强大的智能指针如`unique_ptr`和`shared_ptr`,但了解`auto_ptr`的基本概念和用法对于理解智能指针仍然非常重要。 #### `auto_ptr`的概念与作用 `auto_ptr`主要用来管理动态分配的...

    cvtest1_ME_с++._

    6. **内存管理**:C++允许直接操作内存,包括动态内存分配(new、delete)和智能指针(如unique_ptr、shared_ptr、weak_ptr),以避免内存泄漏和悬挂指针问题。 7. **C++11及以后的新特性**:自C++11以来,C++引入...

    shared_ptr

    shared_ptr boost audio video AVDataPool

    unique_ptr源码

    该文档是C++ auto_ptr源码,感兴趣的可以自行下载学习,方便大家学习参考。

    C++智能指针-unique-ptr智能指针详解.pdf

    其中,`unique_ptr`是一种特殊的智能指针,它拥有对所指向内存的唯一所有权,不允许与其他`unique_ptr`共享所有权。 `unique_ptr`的特性主要体现在以下几个方面: 1. **唯一所有权**:每个`unique_ptr`实例独占其...

    C++11 下使用 Boost.Serialization 库实现智能指针的序列化

    在C++11及更高版本中,智能指针(如`std::unique_ptr`,`std::shared_ptr`和`std::scoped_ptr`)被引入来更好地管理动态内存,因此理解如何在这些指针上实现序列化至关重要。 首先,让我们关注`std::unique_ptr`。`...

    Instantiating _com_ptr_t objects remotely讨论_com_ptr_t远程

    《_com_ptr_t对象的远程实例化探讨》 在IT领域,尤其是Windows应用程序开发中,COM(Component Object Model)技术是构建组件和对象之间交互的关键。_com_ptr_t是Microsoft的ATL(Active Template Library)中提供...

    auto_ptr再回忆

    标题与描述均提到“auto_ptr再回忆”,暗示文章将通过一个故事的形式,回顾与探讨C++中`auto_ptr`的使用及其潜在问题。`auto_ptr`是C++标准库中的一个智能指针类,用于自动管理动态分配的资源,当`auto_ptr`对象超出...

Global site tag (gtag.js) - Google Analytics