В вопросе есть конфликт, как написано: std::string
определяется как std::basic_string<char,...>
- то есть тип его элемента char
(1 байт), но позже вы заявили, что «строка содержит многобайтовыйstring "(" multibyte "== wchar_t
?).
Функция-член size()
не считает завершающий ноль.Это значение представляет количество символов (не байтов).
Предполагая, что вы хотели сказать, что ваша многобайтовая строка равна std::wstring
(псевдоним для std::basic_string<wchar_t,...>
), объем памяти для символов std::wstring
,в том числе нулевой терминатор:
std::wstring myString;
...
size_t bytesCount = (myString.size() + 1) * sizeof(wchar_t);
Поучительно рассмотреть, как можно написать многократно используемую шаблонную функцию, которая бы работала для ЛЮБОЙ потенциальной реализации std :: basic_string <> следующим образом **:
// Return number of bytes occupied by null-terminated inString.c_str().
template <typename _Elem>
inline size_t stringBytes(const std::basic_string<typename _Elem>& inString, bool bCountNull)
{
return (inString.size() + (bCountNull ? 1 : 0)) * sizeof(_Elem);
}
** Для простоты игнорирует признаки и типы распределителей, редко указываемые явно для std::basic_string<>
(они имеют значения по умолчанию).