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

Я, как предполагается, звоню, удаляют здесь к свободному память? Или был то, что память просто adoped BSTR?

7
задан noctonura 20 April 2010 в 17:04
поделиться

5 ответов

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

9
ответ дан 6 December 2019 в 07:05
поделиться

Да, удалить память.

3
ответ дан 6 December 2019 в 07:05
поделиться

Чтобы преобразовать 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
0
ответ дан 6 December 2019 в 07:05
поделиться

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

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

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

3
ответ дан 6 December 2019 в 07:05
поделиться

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 Семантика .

10
ответ дан 6 December 2019 в 07:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: