【问题标题】:Memory leak for CComBSTRCComBSTR 的内存泄漏
【发布时间】:2010-12-17 06:11:55
【问题描述】:

我读到以下代码会导致内存泄漏。但不明白为什么。

CComBSTR str;
pFoo->get_Bar(&str);
pFoo->get_Baf(&str);

当我们不分配任何东西时,它是如何导致泄漏的?

【问题讨论】:

    标签: com memory-leaks com-interop atl bstr


    【解决方案1】:

    此 Microsoft 页面可能是您了解它的地方:

    http://msdn.microsoft.com/en-us/library/bdyd6xz6.aspx

    内存泄漏问题

    将初始化的 CComBSTR 的地址作为 [out] 参数传递给函数会导致内存泄漏。

    CComBSTR 对象在内部分配内存。显然在某些情况下它不会释放它。

    【讨论】:

      【解决方案2】:

      它泄漏是因为 get_Bar()get_Baf() 不知道您正在使用 CComBSTR。

      当您获取 CComBSTR 的地址时,您实际上传递给底层对象的是指向 CComBSTR 的 BSTR 成员的指针。

      分解顺序:

      CComBSTR str;
      

      这会将内部 BSTR 初始化为 NULL。

      pFoo->get_Bar(&str);
      

      get_Bar() 看到一个 BSTR* 并用实际数据填充它。像这样:

      HRESULT get_Bar(BSTR* arg) { *arg = SysAllocString(L"My String"); }
      

      现在str 的内部 BSTR 是真正的 BSTR。当 CComBSTR 超出范围时,它将删除 str 成员。

      现在,如果您在 &str 上调用 get_Baf(),问题是 CComBSTR 不知道您正在更改字符串。所以你像这样打电话给get_Baf()

      HRESULT get_Baf(BSTR* arg) { *arg = SysAllocString(L"My String"); }
      

      现在get_Baf() 已经覆盖了str 内部BSTR 的原始值,而没有任何人释放get_Bar() 分配的数据。

      Ta da - 内存泄漏。

      【讨论】:

      • 所以如果我们只有前两行 CComBSTR str; pFoo->get_Bar(&str);那么它不会导致泄漏,也不需要清空它。
      • 我曾经在 CComBSTR 中提出过泄漏警告,但我不确定它是否还在(这台机器上没有 Visual Studio)。如果您尝试在初始化的 CComBSTR 上使用 operator&,则应该会触发一个断言。您可能需要定义一些符号来启用它——请参阅 CComBSTR 的源代码。
      猜你喜欢
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-06
      • 1970-01-01
      • 1970-01-01
      • 2019-07-05
      • 2016-05-09
      • 2017-11-03
      相关资源
      最近更新 更多