当通过堆上的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做的?
答案 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