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

问题描述 投票:0回答:5

当通过堆上的 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 占用了?

c++ windows string memory-management bstr
5个回答
13
投票

文档中的 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 的 BSTR 语义完整指南


12
投票

顾名思义,

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


4
投票

SysAllocString()
的文档非常清楚:

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

您传入的字符串数据被复制 -

SysAllocString()
完成后不会使用它 - 您可以自由地释放或修改该缓冲区。


3
投票

是的,

delete
记忆。


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
© www.soinside.com 2019 - 2024. All rights reserved.