我在下面的场景中使用CComBSTR,
void MyDlg::OnTimer()
{
......
CComBSTR statusString1 = ::SysAllocString(_T("Test"));
....
}
定时器将在每5秒钟内执行一次。
在上述情况下,每5秒就会增加一次。根据我的理解,当CComBSTR超出范围时,它会清理内存。因此,只要计时器结束,就必须释放分配的内存。但事实并非如此。
我需要了解何时在使用CCOMBSTR时释放内存。
答案 0 :(得分:2)
您使用CComBSTR是错误的。 CComBSTR正在复制已分配的字符串,而不是取得它的所有权。您可以像这样初始化您的CComBSTR:
CComBSTR statusString1( L"Test" );
如果您想取得之前分配的字符串的所有权,请执行以下操作:
BSTR bstrAlloc = ::SysAllocString(_T("Test"));
... Your Code ...
CComBSTR status;
status.Attach( bstrAlloc );
然后当CComBSTR超出范围时,它将销毁分配的字符串。
更多信息:我建议您查看atlcomcli.h
中的CComBSTR实现(通常位于C:\ Program Files(x86)\ Microsoft Visual Studio 10.0 \ VC \ atlmfc \ include文件夹中)。这并不复杂。