Могу ли я освободить память, переданную SysAllocString?

при выделении нового 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;

Я должен вызвать delete здесь, чтобы освободить память? Или это воспоминание только что переняла BSTR?

5 ответов


как следует из названия,SysAllocString выделяет свою память, она не" принимает " память своего аргумента. BSTRs имеют префикс размера и null-terminated, поэтому "принятие" строки в стиле c невозможно, так как нет места для префикса размера.


SysAllocString(), от документация, ведет себя так:

эта функция выделяет новую строку и копирует в него переданную строку.

Итак, Да, после вызова SysAllocString вы можете освободить исходный массив символов, поскольку данные были скопированы во вновь выделенный BSTR.

правильный способ освободить строку wchar_t выделено new[] - использовать delete[].

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

правильный способ освободить BSTR С SysFreeString():

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

пока вы новичок в BSTRs, вы должны прочитать Полное руководство Эрика по семантике BSTR.


да delete память.


документы на SysAllocString() довольно ясно:

эта функция выделяет новую строку и копирует в нее переданную строку.

строковые данные, которые вы передаете, копируются -SysAllocString() не использует его после его завершения - вы можете освободить или изменить этот буфер.


преобразование wchar_t* to 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