您的位置:首页 > 编程语言 > C语言/C++

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: