使用std::vector::insert向uint8_t向量插入字符串出现乱码求助
问题原因分析:vector.insert()插入字符串出现乱码
你遇到的乱码问题,核心原因是调用insert时传入了两个不属于同一对象的迭代器:
在代码data.insert(data.end(), getVal().begin(), getVal().end());中,getVal()被调用了两次,每次调用都会生成一个全新的临时std::string对象。第一个getVal().begin()属于第一个临时字符串,第二个getVal().end()属于第二个临时字符串——这两个迭代器指向的是完全独立的内存区域,组成的迭代器范围是无效的。
这种情况属于C++标准定义的未定义行为,程序可能会插入乱码、出现异常,甚至直接崩溃,具体表现取决于编译器和运行环境。
而你改用遍历字符串并push_back()的方式时,本质上是操作同一个字符串对象的迭代器(哪怕是临时对象,只要在同一个表达式中持续有效),迭代器范围合法,所以不会出现问题。
修正方案
只需要把getVal()的结果先存储到一个变量中,确保begin()和end()属于同一个对象:
int main() { std::vector<uint8_t> data {0x70}; std::string val = getVal(); // 存储临时对象到变量,延长生命周期 data.insert(data.end(), val.begin(), val.end()); // 后续输出代码不变 for (auto i:data) std::cout << i << std::endl; std::cout << data.size() << std::endl; std::cout << getVal() << " ,type: " << sizeof(getVal()) << ", .size(): " << getVal().size() << std::endl; return 0; }
内容的提问来源于stack exchange,提问作者Muhannad Ali
相关产品推荐
相关产品推荐

