Могу ли я освободить память, переданную в 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;

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


person noctonura    schedule 20.04.2010    source источник
comment
Забавно - я совершенно неправильно прочитал переменные, когда опубликовал свой ответ (который впоследствии удалил). Я видел delete[] bs; вместо хз. Мне нужны новые очки.   -  person Mark Wilkins    schedule 20.04.2010


Ответы (5)


Как следует из названия, SysAllocString выделяет свою память, а не «принимает» память своего аргумента. BSTR имеют префикс размера и и заканчиваются нулем, поэтому «принятие» строки в стиле c невозможно, поскольку для префикса размера нет места.

person Éric Malenfant    schedule 20.04.2010

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.

person i_am_jorf    schedule 20.04.2010

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

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

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

person Michael Burr    schedule 20.04.2010

Да, delete память.

person John Dibling    schedule 20.04.2010