MFC CString作为函数返回值存在内存泄漏 求解决方法 100分

MFC CString作为函数返回值存在内存泄漏 求解决办法 100分
使用CString作为函数返回值 用Visual Leak Detector检查出有内存泄漏,代码如下:
CString CParseXML::GetNodeDialogType(CString strNodeName)
{
CString strSelect;
CString strNodeDialogType;
MSXML2::IXMLDOMNodePtr pItem;
MSXML2::IXMLDOMNodePtr pAttrItem;
MSXML2::IXMLDOMNamedNodeMapPtr pAttrs = NULL;
m_strDevicePathName = CM_DEV_DES_FILE_FOLDER + CGlobeContent::cmStrDevName + CM_FILE_EXTENSION; //DialogType
CoInitialize(NULL);
HRESULT hr = m_pDevDoc.CreateInstance(__uuidof(MSXML2::DOMDocument));
if(!SUCCEEDED(hr))
{
AfxMessageBox(CREATE_DOMDOCUMENT_ERROR);
}
m_pDevDoc->load((_bstr_t)m_strDevicePathName);
strSelect =  CM_XML_ATTR_START + strNodeName + CM_XML_ATTR_END;
pItem = m_pDevDoc->selectSingleNode((_bstr_t)strSelect);
pItem->get_attributes(&pAttrs);
pAttrs->get_item(XML_ATTR_DIALOG_TYPE,&pAttrItem);
strNodeDialogType = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
pItem.Release();
pAttrItem.Release();
pAttrs.Release();
CoUninitialize();
return strNodeDialogType;
}

如下调用:
CString strTest;
strTest = GetNodeDialogType(strNodeName);

在线等啊
------解决方案--------------------
HRESULT hr = m_pDevDoc.CreateInstance(__uuidof(MSXML2::DOMDocument)); //没释放吧

m_pDevDoc.Release();
------解决方案--------------------
引用:
Quote: 引用:

说的是CString,不是XML,
m_pDevDoc那个在析构函数里面已经释放了


你是如何确定泄露是CString造成的??
------解决方案--------------------
感觉没哪里有问题。。在调用CoUninitialize()前也调用一下m_pDevDoc->Release吧
------解决方案--------------------
的确看不出问题
------解决方案--------------------
CString本身大概不会有泄露,每个CString对象都自己管理字符串空间,就算返回、等号、字符串一样也都是位置不同的物理空间。
真正泄露的地方好像真是4楼说的,m_pDevDoc也许在别的地方你释放了,但对于这个函数来说不配对。只能说这个函数不符合好的编码习惯,一旦m_pDevDoc所在类没析构但ParseXML函数反复调用了那就会有泄露了。要是你说函数也只调用一次,查泄露的软件可不知道,只能按照一些既存的共识的规则(比如好的设计都是谁创建谁释放)来判断。
------解决方案--------------------
应该没什么问题了
------解决方案--------------------
引用:
Quote: 引用:

CString本身大概不会有泄露,每个CString对象都自己管理字符串空间,就算返回、等号、字符串一样也都是位置不同的物理空间。
真正泄露的地方好像真是4楼说的,m_pDevDoc也许在别的地方你释放了,但对于这个函数来说不配对。只能说这个函数不符合好的编码习惯,一旦m_pDevDoc所在类没析构但ParseXML函数反复调用了那就会有泄露了。要是你说函数也只调用一次,查泄露的软件可不知道,只能按照一些既存的共识的规则(比如好的设计都是谁创建谁释放)来判断。


引用:
Quote: 引用:

Quote: 引用:

说的是CString,不是XML,
m_pDevDoc那个在析构函数里面已经释放了


你是如何确定泄露是CString造成的??

MFC CString作为函数返回值存在内存泄漏 求解决方法 100分
还是一样,这是刚刚吧m_pDevDoc放在这个函数里面释放的 ,上图中的方框是CString的内容,Visual Leak Detector 也指向CString



strNodeDialogType = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;
这句试试strNodeDialogType = CString((LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue);
忘了如果CString的用等号右边要是字符串指针的话是直接指向还是创建新的拷贝。如果是前者的话那当你把pAttrItem给release的时候是不是同时把字符串也给释放了,那么CString就指向野指针了。
------解决方案--------------------
用什么 “用Visual Leak Detector检查”
vc 自己 有没有 报 mem leak ?
------解决方案--------------------

你要是怀疑CString  返回值方式有问题
那你就把函数改成传入引用获取返回值的方式试试。

http://blog.****.net/csm120224267/article/details/6589942

------解决方案--------------------
是 CObject  泄露 ?
点击 泄露处 看看 是 什么 ?
------解决方案--------------------
我觉得不太可能是CString的泄露,如果真要算,那估计可能是Visual Leak Detector检测到有new而没有delete,尽管这个对象你仍在用。比如你在构造里new,析构里delete,但对象仍在生命周期里,这时候报内存泄露那就说得通了。可以把Com这块注释掉看还会报泄露不
------解决方案--------------------
CString在多线程编程中出现过内存泄露,作为局部变量,按理应该在函数结束后就销毁了,我是额外添加代码调用strTemp.Empty()释放内存的,之后就没泄露了。

你的程序确定是CString泄露?如果是,把CString strNodeDialogType设置为类变量,析构函数里添加strNodeDialogType.Empty()试试看。。。
------解决方案--------------------
感觉不会有问题的吧  实在不行就用引用出参吧
------解决方案--------------------
strNodeDialogType = (LPCTSTR)(_bstr_t)pAttrItem->nodeTypedValue;

这句有问题。你是把一个指针赋值给该变量。函数调用完之后 pAttrItem 自动释放。

你把这个指针当做内容返回,但是指针指向的内容已经在栈中释放了。