高手指教内存泄露在哪里?

baguijin999 2007-07-13 04:54:57
HRESULT CDBManager::_sel_ShipInfo(volatile BOOL &bSel)
{
int i;
_bstr_t bstrString;
//连接地址
char m_cApsPath[260];
strcpy(m_cApsPath,m_urlPath);
strcat(m_cApsPath,"listShips");
SHIP_INFO Info;
HRESULT hr;

IXMLDOMDocumentPtr pResponseXML = NULL;
hr=0;

hr = pResponseXML.CreateInstance(__uuidof(DOMDocument40));
if( FAILED(hr) )
{
return 0;
}
IXMLHTTPRequestPtr pIXMLHTTPRequest = NULL;
try
{// 发送xml
hr = pIXMLHTTPRequest.CreateInstance(__uuidof(XMLHTTP40));
SUCCEEDED(hr) ? 0 : throw hr;
hr = pIXMLHTTPRequest->open("post", m_cApsPath, false);
SUCCEEDED(hr) ? 0 : throw hr;
pIXMLHTTPRequest->send("");
SUCCEEDED(hr) ? 0 : throw hr;
if(pIXMLHTTPRequest->readyState==4)
{
pResponseXML = pIXMLHTTPRequest->responseXML;
//_bstr_t bstr = pIXMLHTTPRequest->responseText;
bstrString = pResponseXML->xml;

//{ 接收
IXMLDOMElementPtr xmlRoot = NULL;
/////////////////////////////////////////////////////////////////////////////////begin
xmlRoot=pResponseXML->documentElement;
CString tempchar;
tempchar.Format((char*)_bstr_t(xmlRoot->nodeName));
/////////////////////////////////////////////////////////////////////////////////end

CString str1;
MSXML2::IXMLDOMElementPtr childNode;//,schildnode;

str1="//ships";
//在树中查找名为节点,"//"表示在任意一层查找
childNode = (MSXML2::IXMLDOMElementPtr)(pResponseXML->selectSingleNode((_bstr_t)str1));

IXMLDOMNodeListPtr xmlChildNodes = NULL; //一级
IXMLDOMNodeListPtr sxmlChildNodes = NULL;//一级的下一级
childNode->get_childNodes(&xmlChildNodes);

IXMLDOMNode* currentNode = NULL; //操作节点

i=0;
//得到节点值
char cValue[2000];
VARIANT varVal;
while(!FAILED(xmlChildNodes->raw_nextNode(¤tNode)) && currentNode != NULL)
{
//schildnode=currentNode;
//schildnode->get_childNodes(&sxmlChildNodes);
currentNode->get_childNodes(&sxmlChildNodes);
while(!FAILED(sxmlChildNodes->raw_nextNode(¤tNode)) && currentNode != NULL)
{
//得到节点名
tempchar.Format((char*)_bstr_t(currentNode->nodeName));

currentNode->get_nodeTypedValue(&varVal);
memcpy(cValue, (char*)(_bstr_t)varVal, strlen((char*)(_bstr_t)varVal));cValue[strlen((char*)(_bstr_t)varVal)] = '\0';

if (tempchar=="MMSI") Info.userid=atol(sz_Trim(cValue));
if (tempchar=="IMO") Info.IMO = atol(sz_Trim(cValue));
if (tempchar=="callSign") strcpy(Info.CallSign,sz_Trim(cValue));
if (tempchar=="name") strcpy(Info.Name,sz_Trim(cValue));
if (tempchar=="shipType")
Info.ShipType=atoi(sz_Trim(cValue));
if (tempchar=="dimBow") Info.Dim_bow=atoi(sz_Trim(cValue));
if (tempchar=="dimStern")
Info.Dim_stern=atoi(sz_Trim(cValue));
if (tempchar=="dimPort")
Info.Dim_port=atoi(sz_Trim(cValue));
if (tempchar=="dimStarboard")
Info.Dim_starboard =atoi(sz_Trim(cValue));
if (tempchar=="posType") Info.pos_type=atoi(sz_Trim(cValue));
if (tempchar=="posAcc") Info.pos_acc =atoi(sz_Trim(cValue));
if (tempchar=="lat") Info.latitude =atof(sz_Trim(cValue))* 600000;
if (tempchar=="lon") Info.longitude =atof(sz_Trim(cValue))* 600000;
if (tempchar=="time") strcpy(Info.rectime,sz_Trim(cValue));
if (tempchar=="COG") Info.cog=atoi(sz_Trim(cValue));
if (tempchar=="SOG") Info.sog=atoi(sz_Trim(cValue));
if (tempchar=="heading") Info.heading=atoi(sz_Trim(cValue));
if (tempchar=="navStatus")
Info.nav_status=atoi(sz_Trim(cValue));
if (tempchar=="ROT") Info.rot = atoi(sz_Trim(cValue));
if (tempchar=="draught") Info.Draught = atoi(sz_Trim(cValue));
if (tempchar=="hazardousCargo") Info.HazardousCargo=atoi(sz_Trim(cValue));
if (tempchar=="dest") strcpy(Info.Dest,sz_Trim(cValue));
if (tempchar=="ETA") Info.ETA =atol(sz_Trim(cValue));
if (tempchar=="timeStamp") Info.utc_sec=atoi(sz_Trim(cValue));
if(&varVal)
VariantClear(&varVal);

i++;
SAFE_RELEASE(currentNode);
}

SHIP_INFO *pStation = CShipManager::bIsBaseStation(Info.userid);

if(pStation)
{
*pStation = Info;
}
else
{
bool bOutTime = false;
CShipManager *pShipManager = CShipManager::Instance();
if(pShipManager->m_DisParam.lTimeOut>0)
{
CTimeSpan span(0, 0, pShipManager->m_DisParam.lTimeOut, 0);
CTime time, curtime = CTime::GetCurrentTime();
get_DataTime(time, Info.rectime);
bOutTime = curtime-time>span?true:false;
}

if(!bOutTime && (!pShipManager->m_DisParam.bIsFilter || CShipManager::bIsInTrackSel(Info.userid)))
{
SHIP_INFO *pShip = CShipManager::addShip(Info.userid);
if(stricmp(pShip->rectime, Info.rectime)!=0 && (pShip->latitude!=Info.latitude || pShip->longitude!=Info.longitude))
{// 只处理更新的点位
*pShip = Info;
if(CShipManager::bIsInTrackHis(Info.userid))
{
pShip = CShipManager::addShipHis(Info.userid);
*pShip = Info;
}
}
SHIP_STATIC *pShipStatic = CShipManager::addShipStatic(Info.userid);
*pShipStatic = *(SHIP_STATIC*)&Info;
}
else
{
CShipManager::delShip(Info.userid);
}
}

//SAFE_RELEASE(sxmlChildNodes);
sxmlChildNodes.Release();
}
SAFE_RELEASE(currentNode);
//SAFE_RELEASE(xmlChildNodes);
xmlChildNodes.Release();

childNode.Release();
xmlRoot.Release();
//}
}
pIXMLHTTPRequest.Release();
pResponseXML.Release();
}
catch (...)
{
printf("error: %x\n", hr);
}

SetEvent(m_hEvent);
if( FAILED(hr) )
{
return 1;
}
return 0;
}
...全文
274 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjdev 2007-07-14
  • 打赏
  • 举报
回复
代码有点长,其实你使用vc就可以查看内存泄露.
debehe 2007-07-13
  • 打赏
  • 举报
回复
IXMLDOMNode* currentNode = NULL; //操作节点
看一下...
lyg_zy 2007-07-13
  • 打赏
  • 举报
回复
以下两句修改了吧
IXMLDOMNode* currentNode = NULL;
VARIANT varVal;

IXMLDOMNodePtr currentNode = NULL;
CComVariant varVal;

lkldiy 2007-07-13
  • 打赏
  • 举报
回复
看不下去了
baguijin999 2007-07-13
  • 打赏
  • 举报
回复
IXMLDOMDocumentPtr 不是智能指针?
lyg_zy 2007-07-13
  • 打赏
  • 举报
回复
您的所有使用COM对象的地方都修改成智能指针:
比如
IXMLDOMDocumentPtr pResponseXML ;
修改为
CComPtr< IXMLDOMDocument > pResponseXML;

在COM里如果有一引用未Release那么内存最后就不会释放的。

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧