【问题标题】:CComBSTR memory managementCComBSTR 内存管理
【发布时间】:2012-08-12 12:49:04
【问题描述】:

我在以下场景中使用 CComBSTR,

void MyDlg::OnTimer()
{

      ......

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

      ....

}

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

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

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

【问题讨论】:

  • 你如何衡量内存增加?
  • 案例 1:我使用 Windows 任务管理器并在“已用内存”中获得了内存使用情况;在这种情况下,如果我创建动态内存并删除,它会增加和减少。但在 CCOMBSTR 的情况下,它不是。案例 2:我使用 GlowCode 并查看当前字节数。
  • 任务管理器现在会向您显示可靠的指示。请改用性能监视器或进程资源管理器,有关详细信息,请参阅stackoverflow.com/questions/1984186/…

标签: visual-c++ mfc atl bstr


【解决方案1】:

您对 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 文件夹中)。并不复杂。

【讨论】:

    猜你喜欢
    • 2010-12-08
    • 2010-12-17
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-07-21
    • 2012-03-21
    相关资源
    最近更新 更多