Могу ли я освободить память, переданную SysAllocString? - PullRequest
7 голосов
/ 20 апреля 2010

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

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

Ответы [ 5 ]

10 голосов
/ 20 апреля 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 .

9 голосов
/ 20 апреля 2010

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

3 голосов
/ 20 апреля 2010

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

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

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

3 голосов
/ 20 апреля 2010

Да, delete память.

0 голосов
/ 20 апреля 2010

Для преобразования 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
...