8

当通过堆上的 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;

我应该在这里调用 delete 来释放内存吗?还是那段记忆只是被 BSTR 掺杂了?

4

5 回答 5

12

来自文档的 SysAllocString() 的行为如下:

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

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

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

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

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

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

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

于 2010-04-20T17:17:16.803 回答
11

顾名思义,SysAllocString分配它的内存,它不会“采用”它的参数的内存。BSTR 是大小前缀空终止的,因此“采用”c 样式字符串是不可能的,因为大小前缀没有空间。

于 2010-04-20T17:07:33.413 回答
4

的文档SysAllocString()非常清楚:

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

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

于 2010-04-20T17:17:45.367 回答
3

delete的,记忆。

于 2010-04-20T17:09:41.760 回答
1

要转换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
于 2010-04-20T17:22:21.613 回答