自己写的share_ptr + Arry 来制作CString共享版本
发布日期:2021-07-14 20:03:41 浏览次数:1 分类:技术文章

本文共 4015 字,大约阅读时间需要 13 分钟。

#include "MyStudyFile.h"#include 
#include
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
void SwapFun(T& left, T& right){ T temp = left; left = right; right = temp;}template
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 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
* pArry = new CArry
(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
(pStr, strlength(pStr) + 1)); return *this; } int GetLength() const { return m_shareData.Get()->GetSize() - 1; } private: char* cstr() { return *(m_shareData.Get()); } CArry
* CloneData(int iSize) const { return new CArry
(cstr(), GetLength() + 1, iSize); } ShareDataImp
> 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();}

 

转载地址:https://blog.csdn.net/daojin505/article/details/76812729 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:CString的高效版本
下一篇:自己写的share_ptr

发表评论

最新留言

不错!
[***.144.177.141]2024年03月02日 19时04分37秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

html抽奖代码_JavaScript高手之路:封装抽奖效果 2019-04-21
hadoop 3.3 一直停留在running wordcount_蛋价持续下跌,今日跌破3.3元大关!深秋季节价格还能反弹吗?... 2019-04-21
的流程图做完后如何保存_2019超火的半永久眉是哪款?做完后我们如何护理?... 2019-04-21
去除logo 高德地图api_深圳品牌logo升级如何保持原型的同时更具创新? 2019-04-21
二重积分转换成极坐标_二重积分转换极坐标r的范围如何确定? 2019-04-21
python中倒背如流_八字基础知识--倒背如流篇 2019-04-21
以太坊地址和公钥_以太坊地址是什么 2019-04-21
linux查看wifi信号命令_linux – 获取WIFI信号强度 – 寻求最佳方式(IOCTL,iwlist(iw)等)... 2019-04-21
npm 不重启 全局安装后_解决修复npm安装全局模块权限的问题 2019-04-21
vs格式化json 不生效_vs code 格式化 json 配置 2019-04-21
go 字符串反序列化成对象数组_Fastjson 1.2.24反序列化漏洞深度分析 2019-04-21
onmessage websocket 收不到信息_WebSocket断开重连解决方案,心跳重连实践 2019-04-21
hibernate mysql 缓存_hibernate和mysql的缓存问题,没辙了! 2019-04-21
abp框架 mysql_ABP框架使用Mysql数据库 2019-04-21
mysql树形递归删除_使用递归删除树形结构的所有子节点(java和mysql实现) 2019-04-21
linux mysql 不能连接远程_linux mysql 远程连接 2019-04-21
mysql $lt_mongodb中比较级查询条件:($lt $lte $gt $gte)(大于、小于)、查找条件... 2019-04-21
install python_Install python on AIX 7 2019-04-21
jquery查找div下第一个input_jquery查找div元素第一个元素id 2019-04-21
如何修改手机屏幕显示的长宽比例_屏幕分辨率 尺寸 比例 长宽 如何计算 2019-04-21