qt在linux下,有什么好的检测内存泄露的工具吗?
晨曦呢 2015-07-25 11:13:47 顺便附代码一段,求大神指点:
void ThreadData::shareMemoryCpy(int sig)//数据拷贝
{
G_GLOBAL_DATA_TABLE *pDataTabel;
G_GLOBAL_DATA_TABLE *pDataBuf;
GglobalDataTable::instance()->m_sharedDataTable.lock();
pDataTabel = static_cast<G_GLOBAL_DATA_TABLE*>( GglobalDataTable::instance()->m_sharedDataTable.data());
pDataBuf = static_cast<G_GLOBAL_DATA_TABLE*>(m_sharedDataBuf.data());
if(sig == 5 || sig == 4 || sig == 3)
{
slotQueueClear();//缓冲区清空
pDataBuf->stat = true;//共享内存数据状态改变
::memcpy(pDataTabel, pDataBuf, sizeof(G_GLOBAL_DATA_TABLE));
ShareSigEmit(sig,m_recvMsg);
GglobalDataTable::instance()->m_sharedDataTable.unlock();
return ;
}
if(pDataTabel->stat == false && m_queueData.isEmpty())//PAD共享内存数据写入GUI共享内存
{
pDataBuf->stat = true;
::memcpy(pDataTabel, pDataBuf, sizeof(G_GLOBAL_DATA_TABLE));
}else if(pDataTabel->stat == false && !m_queueData.isEmpty()) //缓冲区数据写入GUI共享内存,PAD数据写入缓冲区
{
GglobalDataTable::instance()->m_sharedDataTable.unlock();
//缓冲区数据写入GUI共享内存
slotWriteData();
//PAD共享内存数据写入缓冲区
shareDateCache(pDataBuf,sig);
}else if(pDataTabel->stat == true)//PAD共享内存数据写入缓冲区
{
shareDateCache(pDataBuf,sig);
}
GglobalDataTable::instance()->m_sharedDataTable.unlock();
}
void ThreadData::slotWriteData()//缓冲区数据写入共享内存
{
G_GLOBAL_DATA_TABLE *pDataTabel;
GglobalDataTable::instance()->m_sharedDataTable.lock();
pDataTabel = static_cast<G_GLOBAL_DATA_TABLE*>( GglobalDataTable::instance()->m_sharedDataTable.data());
if(pDataTabel->stat)
{
GglobalDataTable::instance()->m_sharedDataTable.unlock();
return;
}
if(m_queueData.isEmpty())
{
GglobalDataTable::instance()->m_sharedDataTable.unlock();
return;
}
m_queueTabelData=m_queueData.dequeue();
::memcpy(pDataTabel, &m_queueTabelData.m_globalData, sizeof(G_GLOBAL_DATA_TABLE));
GglobalDataTable::instance()->m_sharedDataTable.unlock();
}
void ThreadData::shareDateCache(G_GLOBAL_DATA_TABLE *pDataBuf,int SIgType)//缓存数据
{
if(!queueStat)
return;
pDataBuf->stat = true;
::memcpy(&m_queueTabelData.m_globalData, pDataBuf, sizeof(G_GLOBAL_DATA_TABLE));
m_queueTabelData.DataSig = SIgType;
::memcpy(&m_queueTabelData.m_recvBufMsg, &m_recvMsg, sizeof(process_msg));
m_queueData.enqueue(m_queueTabelData);
//缓冲上限为100个数据包
if(m_queueData.count() >= 100)
slotQueueClear();
}