我可以释放传递给SysAllocString的内存吗?

时间:2010-04-20 17:04:05

标签: c++ windows string memory-management bstr

当通过堆上的wchar_t *分配带有SysAllocString的新BSTR时,我是否应该释放堆上的原始wchar_t *?

这是正确的方法吗?

wchar_t *hs = new wchar_t[20];
// load some wchar's into hs...
BSTR bs = SysAllocString(hs);
delete[] hs;

我应该在这里调用删除以释放内存吗?或者那个记忆是由BSTR做的?

5 个答案:

答案 0 :(得分:10)

来自documentation的SysAllocString(),行为如下:

  

此函数分配一个新字符串   并将传递的字符串复制到其中。

所以,是的,一旦你调用了SysAllocString,就可以释放原始的字符数组,因为数据已被复制到新分配的BSTR中。

免费使用wchar_t分配的new[]字符串的正确方法是使用delete[]

wchar_t *hs = new wchar_t[20];
...
delete[] hs;

释放BSTR的正确方法是SysFreeString()

BSTR bs = SysAllocString(hs);
...
SysFreeString(bs);

虽然您不熟悉BSTR,但应阅读Eric's Complete Guide to BSTR Semantics

答案 1 :(得分:9)

顾名思义,SysAllocString分配其内存,它不会“采用”其参数的内存。 BSTR是以大小为前缀的以null结尾,因此“采用”c风格的字符串是不可能的,因为大小前缀没有空格。

答案 2 :(得分:3)

是的,delete记忆。

答案 3 :(得分:3)

The docs for SysAllocString()非常明确:

  

此函数分配一个新字符串并将传递的字符串复制到其中。

传入的字符串数据被复制 - SysAllocString()在完成后不使用它 - 您可以自由地释放或修改该缓冲区。

答案 4 :(得分:0)

要将wchar_t*转换为OLECHAR*,您需要使用W2OLE宏:

wchar_t *hs = new wchar_t[20];
USES_CONVERSION;
BSTR bs = SysAllocString( W2OLE(hs) );
delete[] hs; // no need in hs anymore since SysAllocString allocates memory
...

SysFreeString( bs );  // delete Sys string