C++ vector调用insert函数后遍历输出乱码数字问题求助
问题原因排查
- 核心诱因是vector迭代器失效:
std::vector采用连续内存存储元素,调用insert方法时如果插入后总元素数超过当前容器的预留容量(capacity()返回值),vector会重新申请更大的连续内存块,将原有元素拷贝到新内存后释放旧内存。你在insert执行前保存的it迭代器此时指向已经被释放的旧内存,属于野迭代器,对其解引用是未定义行为,输出乱码就是野内存访问的典型表现。补充:哪怕插入操作没有触发扩容,插入位置之后的迭代器也会失效,因此涉及vector的插入、删除操作后,都不要复用操作前保存的旧迭代器,应当重新获取有效迭代器。
- 其次循环逻辑存在错误:代码中while循环的判断条件完全不符合遍历预期,
while(it != ivec.begin())会导致迭代器不断自增越界访问内存,进一步加剧了异常输出。
修复方案
insert操作完成后重新获取有效迭代器,同时修正遍历判断条件即可,修复后代码参考:
#include <iostream> #include <vector> int main() { std::vector<int> ivec = {2,3,5,7}; std::vector<int>::iterator pos = ivec.begin() + 1; ivec.insert(pos, 444); // insert后重新获取迭代器,不复用之前保存的旧迭代器 auto it = ivec.begin(); while (it != ivec.end()) { std::cout << *it << std::endl; it++; } return 0; }
修复后正常输出结果为:
2 444 3 5 7
内容的提问来源于stack exchange,提问作者meysamimani
相关产品推荐
相关产品推荐

