1

我在以下场景中使用 CComBSTR,

void MyDlg::OnTimer()
{

      ......

      CComBSTR statusString1 = ::SysAllocString(_T("Test"));

      ....

}

计时器将每隔 5 秒执行一次。

在上述情况下,内存每 5 秒增加一次。据我了解,CComBSTR 在超出范围时会清理内存。因此,每当计时器结束时,必须释放分配的内存。但它不是。

我需要了解使用 CCOMBSTR 时何时释放内存。

4

1 回答 1

3

您对 CComBSTR 的使用是错误的。CComBSTR 正在复制分配的字符串,而不是对其拥有所有权。您可以像这样初始化您的 CComBSTR:

CComBSTR statusString1( L"Test" );

如果您想获得先前分配的字符串的所有权,请执行以下操作:

BSTR bstrAlloc = ::SysAllocString(_T("Test"));
... Your Code ...
CComBSTR status;
status.Attach( bstrAlloc );

然后,当 CComBSTR 超出范围时,它将破坏分配的字符串。

更多信息:我建议查看 CComBSTR 的实现atlcomcli.h(通常位于 C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include 文件夹中)。这并不复杂。

于 2012-08-16T09:35:06.417 回答