首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

请帮小弟我看看下面的函数里有内存泄露吗,那个mb->relsase到底要不要,谢谢了

2012-05-24 
请各位高手帮我看看下面的函数里有内存泄露吗,那个mb-relsase到底要不要,多谢了!VOS_INT32 LOG_Ap_Analys

请各位高手帮我看看下面的函数里有内存泄露吗,那个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這東西吧?

热点排行