请各位高手帮我看看下面的函数里有内存泄露吗,那个mb->relsase到底要不要,多谢了!
VOS_INT32 LOG_Ap_Analyse_Scheduler::svc( )
{
LOG_DEB.debug("debug:%s,%d,%s", __FILE__ , __LINE__,"enter LOG_Ap_Analyse_Scheduler::svc");
try
{
VOS_INT16 iRes = VOS_OK;
VOS_INT32 ulRetryTimes = 0;
vector<string> vFileList;
vector<string>::iterator iter;
string strTmp;
int nCount = 0;
char sFileName[256]={0};
VOS_UINT32 ulNumCurAnalyse = 0; //μ±?°?y?ú′|àíè???·???μ?è?????êy?£
//??′?±?D?μè?ùóDè?????íê3é£?è?oóè??aá?2???DD??ò??ú???t′|àí
//CDBAp dbAccess;
ACE_Message_Block *mb = VOS_PTR_NULL;
m_iThreadNum = 1;
m_stLOG_Ap_Analyse_Task.activate(THR_NEW_LWP|THR_JOINABLE, m_iThreadNum);
while(m_toStop != 1)
{
//??è????táD±í£???′?×??à′|àíLOG_ANALYSE_TASK_NUM?????t?£
//′|àííêò??ú?í?aê?è??a£?è?1?è??aê§°ü£??ò????è???oí???ˉ£??-?·??ê?
//??è?òa′|àíμ????táD±í
LOG_Ap_FileMgr::instance()->getFile2Analyze(vFileList);
//cout << "vFileList's size is : " << vFileList.size() << endl;
if (vFileList.size()>0)
{
//·?·¢′|àíè??????t
while (vFileList.size() != 0)
{
//????3?×?±?·?·¢μ???3ìêy
if (vFileList.size() > m_iThreadNum)
{
ulNumCurAnalyse = m_iThreadNum;
}
else
{
ulNumCurAnalyse = vFileList.size();
}
iter = vFileList.begin();
//ìí?ó??ê±
for(int i = 0; i<ulNumCurAnalyse; i++)
{
mb = VOS_PTR_NULL;
mb = new ACE_Message_Block (iter->length()+1);
//??????êy?÷
ulRetryTimes = 0;
while (mb == VOS_PTR_NULL)
{
if ((ulRetryTimes%ALARM_REMALLOC_RETRY) == 0)
{
LOG_AP.emerg(LOG_FILE_FARMAT_OUT, INFO_MALLOC_FAIL);
ALARM_AP(LOG_Alarm::EMERG, INFO_MALLOC_FAIL, LOG_Alarm::OS);
}
//·????ú′?ê§°ü£?DY??ò???oó??ê?
//sleep(APP_RETRY_TIMEOUT);
ulRetryTimes++;
LOG_AP.info("error:%s,%d,%s", __FILE__ , __LINE__,"·????ú′?ê§°ü£?DY??ò???oó??ê?");
mb = new ACE_Message_Block (iter->length()+1);
}
//cout << "iter->c_str() : " << iter->c_str() << endl;
strcpy(mb->wr_ptr(), iter->c_str());
mb->wr_ptr( iter->length()+1);
strcpy(sFileName,iter->c_str());
//·?·¢??′|àí??3ì
m_stLOG_Ap_Analyse_Task.putq(mb);
vFileList.erase(iter);//??3yò?·?·¢μ????t
//mb->release();//这个release到底应要不要,如果要的话应该放在在哪里,以前的程序是没有这个东西的,我加了,但是程序不能处理文件了
}
//μè′y×ó??3ì′|àí
m_stLOG_Ap_Analyse_Task.getCount(nCount);
while(ulNumCurAnalyse != nCount)
{
m_stLOG_Ap_Analyse_Task.getCount(nCount);
usleep(500);
}
//dbAccess.nUpdateFileState(sFileName, 0);
m_stLOG_Ap_Analyse_Task.clrCount(ulNumCurAnalyse);
}
}
else
{
//No get files from file manager, sleep 5 second
LOG_DEB.debug("debug:%s,%d,%s", __FILE__ , __LINE__,"No get files from file manager, sleep 5 second");
usleep(1000);
// sleep(1);
}
}
m_stLOG_Ap_Analyse_Task.stop();
m_stLOG_Ap_Analyse_Task.wait();
LOG_DEB.debug("debug:%s,%d,%s", __FILE__ , __LINE__,"exit LOG_Ap_Analyse_Scheduler::svc");
return VOS_OK;
}catch(...){
LOG_AP.info("Ap exception:LOG_Ap_Analyse_Scheduler::svc( )");
}
}
[解决办法]
m_stLOG_Ap_Analyse_Task.putq(mb);
看起是把md放到列..那你release掉一定有~
我想段是吧,去查查m_stLOG_Ap_Analyse_Task西吧?