描述:
我的一个程序调用一个COM里面的方法如下:
BSXML=m_pSetting->Load(CCQRMainApp::GetDataSecurityObj(),bstrUser,bstrName);//-----返回的值,这里的现象比较怪异
BSXML返回一个XML字符串
m_pSetting是那个COM对象,Load函数是这样声名的:
STDMETHOD(Load)(IDispatch *pDataSecurity,BSTR strUser,BSTR strSettingName,/*[out,retval]*/BSTR *strXML);
函数里面是这样得到strXML的:
strC//从数据库中把放在ntext字段中的xml读出来
*strXML=strContent.copy();////这中赋值方法应该没问题
return S_OK;
==============================
现象:load函数中所有的记录都能正确读出来,strXML中也能正确赋值。
我调试跟踪,strXML对应的内存中有正确的内容。
但当load函数返回到主程序的时候,即:BSXML的地址跟strXML地址一样,但load某些记录的时候BSXML地址中的内容变成?????了,请问这是怎么一回事儿啊?我是XP系统,貌似2000下没有这个问题
解决方案1:
把一个已经初始化好的CComBSTR 的地址传给一个函数作为[out]参数会导致内存泄漏。当把CComBSTR用于BSTR*类型的传出参数[out]时,必须首先调用Empty方法清空字符串的内容。
BSXML.Empty();
BSXML=m_pSetting->Load(CCQRMainApp::GetDataSecurityObj(),bstrUser,bstrName);
在把CComBSTR作为[out]参数传递前,调用Empty释必须的。因为按照COM标准中的[out]参数的使用规则-被调用方法不应该在覆盖BSTR的内容前调用SysFreeString。如果你忘记调用Empty,调用前BSTR的内容占用的资源就会泄漏。
对于相同的代码,如果参数类型是[in, out],就不会有泄漏。因为函数会在复制之前,Free原有的串
*strXML=strContent.Detach();
Detach简单的把BSTR移出包装类。这样,在strContent离开作用域的时候就不会被释放。