我无法确切地说出两者之间的有效区别,第一个似乎更有效。第二个可以进行调整,但是存在多字节字符串不完整的问题,并且当我删除大小调整后的字节Writed-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;
答案 0 :(得分:1)
写std::string
的字符数组是不合法的,不能通过c_str()
,不能通过data()
(至少直到C ++ 17),尤其是不能通过像您所做的那样第一个元素的地址。那就是区别,在第一个中使用std::vector<char>
并允许所有这些事情,第二个代码只是未定义的行为。与javascript核心btw无关。