При использовании W2A для преобразования BSTR в std :: string требуется ли очистка?

Код выглядит следующим образом:

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?

3

Решение

Будь очень осторожен с макросами 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 Неправильное использование макросов преобразования». и «Предупреждение относительно временных экземпляров класса» в приведенной выше ссылке.

4

Другие решения

Очистка не требуется, потому что W2A выделяет память в стеке. Есть определенные ловушки, связанные с памятью, о которых вы должны знать (прямые последствия размещения стека), но ничего такого, что выглядит подозрительно в этом конкретном сценарии сразу.

4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector