我们是否需要释放分配给_variant_t的WCHAR []的内存?

时间:2014-12-23 21:01:10

标签: visual-c++ com

std::map<int, _variant_t> myMap;

PWCHAR myData= NULL;
//Set myData to some value.

myMap.insert(std::pair<enStoreArchive, _variant_t>(1, myData ));

在上面的代码示例中,我有一个包含指向PWCHAR(bstr)的变体的映射。

http://roblocher.com/whitepapers/oletypes.html表示变量将释放分配给它的BSTR,但是另一行表示需要手动释放分配给_variant_t的指针中的值。

我是否需要手动释放myData或_variant_t会照顾它?

2 个答案:

答案 0 :(得分:2)

如果你看一下_variant_t的析构函数,你会看到它调用了windows API VariantClear()。

但是,_variant_t的构造函数将为其分配新数据。因此,如果您使用错误,则可能需要删除myData。您当前的示例只显示一个NULL指针。它根本不是很有帮助。

_variant_t将分配自己的数据,实际上与为myData分配的内存无关。如果为myData分配内存,则必须释放它 - 因为_variant_t将自己创建副本。

答案 1 :(得分:2)

VARIANT是一种互操作类型,旨在可以使用具有不同运行时实现的不同语言。关于WCHAR *没有任何可互操作性,如果没有消费者知道它分配了什么堆,就不能可靠地破坏字符串缓冲区。或者就此而言,如果它甚至存储在堆上或来自同一个进程。

因此Windows提供了一种保证分配和释放语义的字符串类型,它是BSTR。底层的winapi调用是SysAllocString()和SysFreeString()。存储是从专用堆分配的,CoTaskMemAlloc()分配的堆。也被SAFEARRAY使用,这是另一种需要相同保证的可变长度类型。

唯一可行的方法是将复制字符串。由带有const wchar_t *的_variant_t构造函数完成,它调用SysAllocString()。因此,您需要再次销毁字符串缓冲区,您可以在将其分配给变体后立即执行此操作。 _variant_t析构函数负责自动销毁副本。