При выделении нового BSTR с SysAllocString через wchar_t* на "куче", я должен затем освободить исходный wchar_t* на "куче"?
Таким образом, действительно ли это - правильный путь?
wchar_t *hs = new wchar_t[20];
// load some wchar's into hs...
BSTR bs = SysAllocString(hs);
delete[] hs;
Я, как предполагается, звоню, удаляют здесь к свободному память? Или был то, что память просто adoped BSTR?
Как следует из названия, SysAllocString
выделяет свою память, а не «перенимает» память своего аргумента. BSTR имеют префикс размера и с завершающим нулем, поэтому «принять» строку в стиле c невозможно, так как для префикса размера нет места.
Чтобы преобразовать 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
Документация для SysAllocString ()
довольно ясна:
Эта функция выделяет новую строку и копирует в нее переданную строку.
Строковые данные, которые вы передаете, копируются - SysAllocString ()
не использует их после завершения - вы можете освободить или изменить этот буфер.
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, вам следует прочитать Полное руководство Эрика по BSTR Семантика .