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