由CString::AllocSysString()生成的BSTR需手动释放还是由COM对象释放?
BSTR内存释放问题解答
代码片段
/* Code Snippet */ CString pString; pString.Format("LoginWhite : %s",IP.GetString()); BSTR szRuleFind = pString.AllocSysString(); // Check for Existing Rule HRESULT hr = pRules->Item(szRuleFind,&pFind); SysFreeString(szRuleFind);
问题
由CString::AllocSysString()生成的BSTR,是像上述代码这样调用SysFreeString()手动释放,还是在释放INetFwRules*类型的COM对象(调用::Release())时由该对象负责释放?
解答
必须像代码里这样手动调用SysFreeString()释放这个BSTR,原因如下:
CString::AllocSysString()本质是调用COM标准的SysAllocString分配内存,遵循COM谁分配谁释放的内存管理原则。INetFwRules::Item方法仅读取传入的BSTR内容,不会接管该BSTR的所有权,因此分配BSTR的代码需要自行负责释放。- 释放
INetFwRules*对象时,只会清理该COM对象自身的内部资源,不会处理你传入的这个BSTR——它不属于该COM对象的管理范畴。
内容的提问来源于stack exchange,提问作者Azriel Elijay
相关产品推荐
相关产品推荐

