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

noc*_*ura 7 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;
Run Code Online (Sandbox Code Playgroud)

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

i_a*_*orf 10

文档中的 SysAllocString()行为如下:

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

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

释放已wchar_t分配字符串的正确方法new[]是使用delete[].

wchar_t *hs = new wchar_t[20];
...
delete[] hs;
Run Code Online (Sandbox Code Playgroud)

释放a的正确方法BSTR是使用SysFreeString():

BSTR bs = SysAllocString(hs);
...
SysFreeString(bs);
Run Code Online (Sandbox Code Playgroud)

虽然您是BSTR的新手,但您应该阅读Eric的BSTR语义完全指南.


Éri*_*ant 9

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