首页 > 解决方案 > 有人可以解释这个 c++ 代码的区别吗?

问题描述

我无法准确说出这些之间的有效区别,第一个似乎更有效。第二个适用于调整,但存在不完整的多字节字符串问题,当我删除调整大小 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;

标签: c++stdjavascriptcore

解决方案


编写 a 的字符数组是不合法的std::string,而不是 via c_str(),而不是 via data()(至少在 C++17 之前),尤其是不能像你那样通过获取第一个元素的地址。这就是区别,在第一个代码中,您使用std::vector<char>允许所有这些东西的地方,第二个代码只是未定义的行为。顺便说一句,它与javascript核心无关。


推荐阅读