C/C++内存操作经典源码(仅供分享)
2009-12-10 10:20
399 查看
//计算数组维数
#define CountArray(Array) (sizeof(Array)/sizeof(Array[0]))
//计算字符长度
#define CountString(String) ((UINT)((lstrlen(String)+1)*sizeof(TCHAR)))
//安全删除指针
#define SafeDelete(pData) { try { if(pData) delete pData; } catch (...) { } pData=NULL; }
//安全删除指针
#define SafeDeleteArray(pData) { try { delete [] pData; } catch (...) { } pData=NULL; }
//************************************
// <p>Description: 插入数据</p>
// <p>Parameters: </p>
// <p> WORD wIdentifier</p>
// <p> void * const pBuffer</p>
// <p> WORD wDataSize</p>
//
// <p>Returns: bool</p>
//************************************
bool CDataStorage::AddData(WORD wIdentifier, void * const pBuffer, WORD wDataSize)
{
//初始化数据
tagDataHead DataHead;
DataHead.wDataSize=wDataSize;
DataHead.wIdentifier=wIdentifier;
DataHead.dwInsertTime=(DWORD)time(NULL)/1000L;
DWORD dwCopySize=sizeof(DataHead)+wDataSize;
try
{
//效验缓冲区
if ((m_dwDataSize+dwCopySize)>m_dwBufferSize) throw 0;
else if ((m_dwInsertPos==m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwBufferSize))
{
if (m_dwDataQueryPos>=dwCopySize) m_dwInsertPos=0;
else throw 0;
}
else if ((m_dwInsertPos<m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwDataQueryPos)) throw 0;
}
catch (...)
{
try
{
//申请内存
DWORD dwNewBufferSize=m_dwBufferSize+__max(m_dwBufferSize/2L,(wDataSize+sizeof(tagDataHead))*10L);
BYTE * pNewQueueServiceBuffer=new BYTE [dwNewBufferSize];
if (pNewQueueServiceBuffer==NULL) return false;
//拷贝数据
if (m_pDataStorageBuffer!=NULL)
{
_ASSERT(m_dwTerminalPos>=m_dwDataSize);
_ASSERT(m_dwTerminalPos>=m_dwDataQueryPos);
DWORD dwPartOneSize=m_dwTerminalPos-m_dwDataQueryPos;
if (dwPartOneSize>0L) CopyMemory(pNewQueueServiceBuffer,m_pDataStorageBuffer+m_dwDataQueryPos,dwPartOneSize);
if (m_dwDataSize>dwPartOneSize)
{
_ASSERT((m_dwInsertPos+dwPartOneSize)==m_dwDataSize);
CopyMemory(pNewQueueServiceBuffer+dwPartOneSize,m_pDataStorageBuffer,m_dwInsertPos);
}
}
//调整变量
m_dwDataQueryPos=0L;
m_dwInsertPos=m_dwDataSize;
m_dwTerminalPos=m_dwDataSize;
m_dwBufferSize=dwNewBufferSize;
SafeDeleteArray(m_pDataStorageBuffer);
m_pDataStorageBuffer=pNewQueueServiceBuffer;
}
catch (...) { return false; }
}
try
{
//拷贝数据
CopyMemory(m_pDataStorageBuffer+m_dwInsertPos,&DataHead,sizeof(DataHead));
if (wDataSize>0)
{
_ASSERT(pBuffer!=NULL);
CopyMemory(m_pDataStorageBuffer+m_dwInsertPos+sizeof(DataHead),pBuffer,wDataSize);
}
//调整数据
m_dwDataPacketCount++;
m_dwDataSize+=dwCopySize;
m_dwInsertPos+=dwCopySize;
m_dwTerminalPos=__max(m_dwTerminalPos,m_dwInsertPos);
return true;
}
catch (...) { }
return false;
}
#define CountArray(Array) (sizeof(Array)/sizeof(Array[0]))
//计算字符长度
#define CountString(String) ((UINT)((lstrlen(String)+1)*sizeof(TCHAR)))
//安全删除指针
#define SafeDelete(pData) { try { if(pData) delete pData; } catch (...) { } pData=NULL; }
//安全删除指针
#define SafeDeleteArray(pData) { try { delete [] pData; } catch (...) { } pData=NULL; }
//************************************
// <p>Description: 插入数据</p>
// <p>Parameters: </p>
// <p> WORD wIdentifier</p>
// <p> void * const pBuffer</p>
// <p> WORD wDataSize</p>
//
// <p>Returns: bool</p>
//************************************
bool CDataStorage::AddData(WORD wIdentifier, void * const pBuffer, WORD wDataSize)
{
//初始化数据
tagDataHead DataHead;
DataHead.wDataSize=wDataSize;
DataHead.wIdentifier=wIdentifier;
DataHead.dwInsertTime=(DWORD)time(NULL)/1000L;
DWORD dwCopySize=sizeof(DataHead)+wDataSize;
try
{
//效验缓冲区
if ((m_dwDataSize+dwCopySize)>m_dwBufferSize) throw 0;
else if ((m_dwInsertPos==m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwBufferSize))
{
if (m_dwDataQueryPos>=dwCopySize) m_dwInsertPos=0;
else throw 0;
}
else if ((m_dwInsertPos<m_dwTerminalPos)&&((m_dwInsertPos+dwCopySize)>m_dwDataQueryPos)) throw 0;
}
catch (...)
{
try
{
//申请内存
DWORD dwNewBufferSize=m_dwBufferSize+__max(m_dwBufferSize/2L,(wDataSize+sizeof(tagDataHead))*10L);
BYTE * pNewQueueServiceBuffer=new BYTE [dwNewBufferSize];
if (pNewQueueServiceBuffer==NULL) return false;
//拷贝数据
if (m_pDataStorageBuffer!=NULL)
{
_ASSERT(m_dwTerminalPos>=m_dwDataSize);
_ASSERT(m_dwTerminalPos>=m_dwDataQueryPos);
DWORD dwPartOneSize=m_dwTerminalPos-m_dwDataQueryPos;
if (dwPartOneSize>0L) CopyMemory(pNewQueueServiceBuffer,m_pDataStorageBuffer+m_dwDataQueryPos,dwPartOneSize);
if (m_dwDataSize>dwPartOneSize)
{
_ASSERT((m_dwInsertPos+dwPartOneSize)==m_dwDataSize);
CopyMemory(pNewQueueServiceBuffer+dwPartOneSize,m_pDataStorageBuffer,m_dwInsertPos);
}
}
//调整变量
m_dwDataQueryPos=0L;
m_dwInsertPos=m_dwDataSize;
m_dwTerminalPos=m_dwDataSize;
m_dwBufferSize=dwNewBufferSize;
SafeDeleteArray(m_pDataStorageBuffer);
m_pDataStorageBuffer=pNewQueueServiceBuffer;
}
catch (...) { return false; }
}
try
{
//拷贝数据
CopyMemory(m_pDataStorageBuffer+m_dwInsertPos,&DataHead,sizeof(DataHead));
if (wDataSize>0)
{
_ASSERT(pBuffer!=NULL);
CopyMemory(m_pDataStorageBuffer+m_dwInsertPos+sizeof(DataHead),pBuffer,wDataSize);
}
//调整数据
m_dwDataPacketCount++;
m_dwDataSize+=dwCopySize;
m_dwInsertPos+=dwCopySize;
m_dwTerminalPos=__max(m_dwTerminalPos,m_dwInsertPos);
return true;
}
catch (...) { }
return false;
}
相关文章推荐
- 一个C++游戏框架开源项目部分源码(仅供分享)
- 以C++为例子,通过操作内存模拟实现对象的持久化存储(一)
- C++程序检测内存泄漏的方法分享
- c++ 经典习题源码
- 【分享】一些经典的C/C++语言基础算法及代码(四)
- [C++ 学习] C++ Primer 第4版 习题 4.30 字符串操作 & 我对堆内存 和 常量区内存的一些理解
- Scala 深入浅出实战经典 第41讲:List继承体系实现内幕和方法操作源码揭秘
- 【C/C++开发】TinyXml操作(含源码下载)
- C++ Standard Stl -- SGI STL源码学习笔记(04) stl_deque && 初涉STL内存管理
- C++源码分享(五):观察者模式泛型实现
- c/c++ 内存操作函数 宏_条件编译
- C++ md5操作(含源码下载)
- 混搭下的C与C++内存操作
- 经典收藏 C++内存管理操作详解
- C++实现类QQ空间图片查看器(源码分享) 推荐
- C++语法 :C/C++ 内存布局详解(经典)
- [转]C++ TinyXml操作(含源码下载)
- c++ void,内存操作函数
- 经典源码分享
- 分享一个在内存里搜索QQ号码的源码,源自看雪论坛