Код выглядит следующим образом:
class A
{
public:
std::string name;
};
A a;
CComBSTR textValue;
// some function which fills textValue
a.name = W2A(textValue);
Теперь я использовал CComBSTR, поэтому мне не нужно освобождать BString, но выделяет ли W2A память, с которой мне, возможно, придется иметь дело? т.е. я должен иметь:
char *tmp = W2A(textValue);
a.name = tmp;
// do something to deallocate tmp?
Будь очень осторожен с макросами W2A / A2W. Они реализованы с помощью «alloca» (динамическое распределение непосредственно в стеке). При определенных обстоятельствах, связанных с циклом / рекурсией / длинной строкой, вы получите «переполнение стека» (без шуток).
Рекомендуемый способ — использовать «новые» шаблоны помощников. Увидеть ATL и MFC Макросы преобразования строк
A a;
CComBSTR textValue;
// some function which fills textValue
CW2A pszValue( textValue );
a.name = pszValue;
Для преобразования используется обычный буферный буфер размером 128 байт. Если это мало, куча используется автоматически. Вы можете настроить компромисс, используя непосредственно типы шаблонов
A a;
CComBSTR textValue;
// some function which fills textValue
CW2AEX<32> pszValue( textValue );
a.name = pszValue;
Не беспокойтесь: вы просто сократили использование стека, но если 32 байта недостаточно, будет использована куча. Как я уже сказал, это компромисс. Если вы не возражаете, используйте CW2A
,
В любом случае, не нужно делать уборку 🙂
Остерегайтесь, когда pszValue выходит из области видимости, любой ожидающий символ * для преобразования может указывать на мусор. Обязательно прочитайте «Пример 3 Неправильное использование макросов преобразования». и «Предупреждение относительно временных экземпляров класса» в приведенной выше ссылке.
Очистка не требуется, потому что W2A
выделяет память в стеке. Есть определенные ловушки, связанные с памятью, о которых вы должны знать (прямые последствия размещения стека), но ничего такого, что выглядит подозрительно в этом конкретном сценарии сразу.