c++ - 有人可以解释这个 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;
解决方案
编写 a 的字符数组是不合法的std::string
,而不是 via c_str()
,而不是 via data()
(至少在 C++17 之前),尤其是不能像你那样通过获取第一个元素的地址。这就是区别,在第一个代码中,您使用std::vector<char>
允许所有这些东西的地方,第二个代码只是未定义的行为。顺便说一句,它与javascript核心无关。
推荐阅读
- performance - Any trick to compute faster Math.pow(10, (0.1x+1.5))?
- r - 如何获得样条模型 R 的 QQ 图
- c - Trouble getting a switch function to loop properly
- javascript - How to validate dynamic values in postman
- javascript - Map.size 返回 0 并且 Map.values() 返回空迭代器,即使地图已填充
- c++ - Does anyone know why GCC is incorrectly changing my c_str pointer?
- git - 如何将 git 用于数据科学/机器学习项目
- javascript - 是否可以使用递归函数将 js 对象解析为有效的 html 标记
- vue.js - v-on:click 无论我做什么调整都不能在 vue.js 上工作,我该如何解决这个问题?
- spring-boot - 发布完成中的错误:jgitflow-maven-plugin