Преобразование больших строк из BSTR tp std :: string?

У меня есть строка в BSTR, и я хотел бы преобразовать ее с помощью W2CA (WideCharToMultiByte):

USES_CONVERSION;
std::string myMBS = W2CA(myBSTR); // myBSTR is BSTR

Но когда строка очень велика — в этой строке выдается исключение «StackOverFlowException».

Но когда я использую это:

std::wstring myWide(myBSTR);
std::string myMBS(myWide.begin(), myWide.end());

У меня работает нормально.
Может ли кто-нибудь помочь с этим поведением?

ОБНОВИТЬ: С большой строкой я имею в виду строку около 10 МБ.

1

Решение

Посмотрите на фактическое определение W2CA от atlconv.h:

#define W2CA(lpw) ((LPCSTR)W2A(lpw))

Теперь посмотрим на определение W2A:

#define W2A(lpw) (\
((_lpw = lpw) == NULL) ? NULL : (\
(_convert = (lstrlenW(_lpw)+1), \
(_convert>INT_MAX/2) ? NULL : \
ATLW2AHELPER((LPSTR) alloca(_convert*sizeof(WCHAR)), _lpw,
_convert*sizeof(WCHAR), _acp))))

Это вызывает alloca, который выделяет память в стеке. Поэтому, естественно, если строка очень длинная, вы рискуете исчерпать доступное пространство стека.

2

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

Других решений пока нет …

По вопросам рекламы [email protected]