【问题标题】:How to Store a VARIANT如何存储 VARIANT
【发布时间】:2010-02-23 22:45:23
【问题描述】:

我需要将 bstr 类型的 VARIANT 存储在 stl 向量中。我不确定我应该如何将 VARIANT 类型存储在向量中。

vector<VARIANT> vec_MyVec;

    VARIANT var_Temp;
    VariantInit(&var_Temp);
    var_Temp.vt = VT_BSTR
    var_Temp.bstrVal = SysAllocString("Test");

vec_MyVec.push_back(var_Temp);

这个实现会导致内存泄漏吗?存储变体的最佳方式是什么?

谢谢

【问题讨论】:

  • 你的意思是“这个实现会导致内存泄漏吗?”据我所知,您存储 VARIANT 的方式很好。
  • 我认为 VARIANT 的副本存储在向量中。然后 SysAllocString() 导致内存泄漏,因为我没有释放我的原始对象。但我不确定。这就是我需要帮助的原因。

标签: c++ windows com


【解决方案1】:

是的,你正在泄漏内存。

每当您使用SysAllocString 系列分配内存时,您必须使用SysFreeString 释放它,或者将它传递给负责释放它的东西。 VARIANT 类型不会清理自己的内存。

你有几个修复它的选项:

  • 使用CComVariantvariant_t。它提供了一个 operator=、复制构造函数和一个为你管理内存的析构函数。将它们存储在向量中的缺点是会创建和销毁临时副本(就像存储 std::string 一样)。这是最简单也是我首选的解决方案。

  • 完成后,对vec_MyVec 中的每个字符串调用SysFreeString。这更有效,但也更容易出错且难以正确执行,尤其是在考虑异常安全时。

  • 存储std::tr1::shared_ptr&lt;CComVariant&gt; 的向量,这将防止创建临时副本,但您将承担引用计数的开销。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 1970-01-01
    相关资源
    最近更新 更多