16,472
社区成员
发帖
与我相关
我的任务
分享
/*
1/ 动态内存分配
2/ 内存自动回收
3/ 注意构造函数、拷贝构造函数、赋值操作符的重载实现以及具体的应用要求
*/
typedef struct _CONTAINOR
{
int nCount; // 元素个数
int nSize; // 已经分配的pszBuffer缓存大小
char* pszBuffer; // 缓存
// 初始化构造函数
_CONTAINOR()
{
nCount = 0;
nSize = 0;
pszBuffer = NULL;
// 初始化内存分配128字节
AllocBuffer(128);
}
// 析构函数 -- 负责内存的动态回收
~_CONTAINOR()
{ // 回收内存,避免内存泄露
if (pszBuffer)
{
delete []pszBuffer;
pszBuffer = NULL;
}
}
// 拷贝构造函数
_CONTAINOR(const _CONTAINOR& stData)
{
// 元素个数
nCount = stData.nCount;
// 缓存空间大小
nSize = stData.nSize;
// 回收原有内存
delete []pszBuffer;
// 分配新的内存大小、初始化
pszBuffer = new char[stData.nSize];
memset(pszBuffer,0,stData.nSize);
// 拷贝数据
memcpy(pszBuffer,stData.pszBuffer,stData.nCount*2);
}
// 赋值操作符重载
const _CONTAINOR& operator = (const _CONTAINOR& stData)
{
nCount = stData.nCount;
nSize = stData.nSize;
delete []pszBuffer;
pszBuffer = new char[stData.nSize];
memset(pszBuffer,0,stData.nSize);
memcpy(pszBuffer,stData.pszBuffer,stData.nCount*2);
return *this;
}
// 分配初始buffer内存
void AllocBuffer(int nLen = 128)
{
nSize = nLen;
pszBuffer = new char[nLen];
memset(pszBuffer,0,nLen);
}
// 追加分配内存
void ReallocBuffer(int nLen)
{
// 分配足够大内存 nSize + nLen
char* pTemp = new char[nSize + nLen];
memset(pTemp,0,nSize + nLen);
// 拷贝现有数据到新的内存
memcpy(pTemp,pszBuffer,nCount*2);
// 释放原来的内存
delete []pszBuffer;
// 设置新的指针指向新分配的内存地址
pszBuffer = pTemp;
// 调整nSize为新分配的内存大小
nSize += nLen;
}
// 追加数据到buffer
void AppendData(const _FLAG& stMsg)
{
if ((nCount+1)*2>nSize)
{ // 缓存空间已经不够使用,重新追加内存
ReallocBuffer(128);
}
// 追加数据到buffer
memcpy(pszBuffer+nCount*2,stMsg.szMsg,2);
// 消息元素计数器增加
++nCount;
}
// 连接两个容器的内容
void InsertData(const _CONTAINOR& stSource)
{
char* pTemp = NULL;
if ((stSource.nCount+nCount)*2>nSize)
{
pTemp = new char[nSize + stSource.nSize];
// 新的缓存空间大小
nSize = nSize + stSource.nSize;
}
else
{
pTemp = new char[nSize];
}
// 头部数据
memcpy(pTemp,stSource.pszBuffer,stSource.nCount*2);
// 尾部数据
memcpy(pTemp+stSource.nCount*2,pszBuffer,nCount*2);
// 回收内存
delete []pszBuffer;
// 指针指向新分配内存
pszBuffer = pTemp;
// 消息元素个数增加
nCount += stSource.nCount;
}
// 释放内存
void ReleaseBuffer(void)
{
if (pszBuffer)
{
delete []pszBuffer;
pszBuffer = NULL;
}
}
} CONTAINOR;