有人可以解释一下此c ++代码的区别吗?

时间:2019-02-23 17:47:40

标签: c++ std javascriptcore

我无法确切地说出两者之间的有效区别,第一个似乎更有效。第二个可以进行调整,但是存在多字节字符串不完整的问题,并且当我删除大小调整后的字节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;

1 个答案:

答案 0 :(得分:1)

std::string的字符数组是不合法的,不能通过c_str(),不能通过data()(至少直到C ++ 17),尤其是不能通过像您所做的那样第一个元素的地址。那就是区别,在第一个中使用std::vector<char>并允许所有这些事情,第二个代码只是未定义的行为。与javascript核心btw无关。