【问题标题】:Can someone explain the difference in this c++ code?有人可以解释这个 c++ 代码的区别吗?
【发布时间】:2019-02-23 17:47:40
【问题描述】:

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

【问题讨论】:

  • 基于这些代码 sn-ps 中的 cmets,这两种选择似乎在逻辑上是等效的。如果您认为第二个有“问题”,则需要提供这些问题的具体示例,包括转储 JSStringGetUTF8CString 在输出缓冲区中生成的内容并返回,这两个代码都是 sn-ps。我希望它在两种情况下都是相同的,并且只要返回值正确,最终结果是相同的。 “问题”的唯一可能方法是 JSStringGetUTF8CString 中的错误,它返回第二个示例所依赖的错误返回值。
  • @SamVarshavchik 这实际上是 react-native 库中的一个问题,当它尝试处理类似:“????”.substring(0,1) 时会发生什么,它在第二个示例中导致调整大小时引发异常。第一个示例运行良好(其他地方也没有明显的问题)。这可能是由于多字节字符,但我不明白为什么第一个示例不会遭受同样的命运。
  • 第一个例子直到它的最终形式才形成std::string,然后从一个以null结尾的字符串形成它。

标签: c++ std javascriptcore


【解决方案1】:

std::string的字符数组是不合法的,不能通过c_str(),不能通过data()(至少在C++17之前),尤其是不能通过将第一个元素的地址作为你做到了。这就是区别,在第一个代码中,您使用std::vector&lt;char&gt;,所有这些都是允许的,第二个代码只是未定义的行为。顺便说一句,它与javascript核心无关。

【讨论】:

    猜你喜欢
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多