Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我可以释放传递给SysAllocString的内存吗?_C++_Windows_String_Memory Management_Bstr - Fatal编程技术网

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

C++ 我可以释放传递给SysAllocString的内存吗?,c++,windows,string,memory-management,bstr,C++,Windows,String,Memory Management,Bstr,当通过堆上的wchar\u t*使用SysAllocString分配新的BSTR时,我是否应该释放堆上的原始wchar\u t* 那么这是正确的方法吗 wchar_t *hs = new wchar_t[20]; // load some wchar's into hs... BSTR bs = SysAllocString(hs); delete[] hs; 我应该在这里调用delete来释放内存吗?还是BSTR刚刚使用了该内存?顾名思义,SysAllocString分配其内存,而不是“采用

当通过堆上的wchar\u t*使用SysAllocString分配新的BSTR时,我是否应该释放堆上的原始wchar\u t*

那么这是正确的方法吗

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

我应该在这里调用delete来释放内存吗?还是BSTR刚刚使用了该内存?

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

是,
删除内存。

SysAllocString()的行为如下:

此函数用于分配新字符串 并将传递的字符串复制到其中

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

释放分配给
new[]
wchar\u t
字符串的正确方法是使用
delete[]

wchar_t *hs = new wchar_t[20];
...
delete[] hs;
释放BSTR的正确方法是:

虽然您是BSTR新手,但您应该阅读。

非常清楚:

此函数用于分配新字符串并将传递的字符串复制到其中


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

要将
wchar\u t*
转换为
oclehar*
,您需要使用宏:


有点可笑——当我发布我的答案(后来我删除了答案)时,我完全误读了变量。我“看见”删除[]个bs;而不是hs。我必须要一副新眼镜。
BSTR bs = SysAllocString(hs);
...
SysFreeString(bs);
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