Может кто-нибудь объяснить разницу в этом коде C ++? - PullRequest
0 голосов
/ 23 февраля 2019

Я не могу точно определить эффективную разницу между ними, первый, кажется, работает более надежно.Второй работает с корректировкой, но имеет проблемы с неполными многобайтовыми строками, и когда я удаляю bytesWritten - 1 с измененным размером, он вообще не работает.Я хотел бы знать, почему они работают по-другому.Спасибо!

Первый:

size_t maxBytes = JSStringGetMaximumUTF8CStringSize(str);
std::vector<char> buffer(maxBytes);
JSStringGetUTF8CString(str, buffer.data(), maxBytes);
return std::string(buffer.data());

Второй:

std::string result;
size_t maxBytes = JSStringGetMaximumUTF8CStringSize(str);
result.resize(maxBytes);
size_t bytesWritten = JSStringGetUTF8CString(str, &result[0], maxBytes);
// JSStringGetUTF8CString writes the null terminator, so we want to resize
// to `bytesWritten - 1` so that `result` has the correct length.
result.resize(bytesWritten - 1);
return result;

1 Ответ

0 голосов
/ 23 февраля 2019

Недопустимо записывать массив символов std::string, не через c_str(), не через data() (по крайней мере, до C ++ 17) и особенно не получая адрес первого элемента какты сделал.Вот в чем разница, в первом вы используете std::vector<char>, где все эти вещи разрешены, второй код - просто неопределенное поведение.Это никак не связано с ядром javascript.

...