网站首页 > 基础教程 正文
上一篇已经给大家分享了《C++ STL vector内存分配策略》,想了解的可以去查看。既然vector是动态分配内存,就会存在迭代器失效的可能,这是很多c++程序员容易出现BUG的地方。
导致迭代器失效的操作主要是insert、push_back(emplace_back)等操作,因为这些操作有可能导致vector重新分配内存,新分配内存后,会释放原来的内存,这时原来的迭代器会失效,如果继续访问会导致程序崩溃。比如:
那么如何解决这个问题呢?两种方法:
1.更新迭代器的值,运行正常:
2.重新定义迭代器,运行正常:
总结:
因此我们在做了一些可能影响迭代器的操作后,如果还想用原来的迭代器的话,一定要记得更新,否则会导致程序崩溃。
文本代码如下,需要测试的自取:
1.迭代器失效导致程序崩溃代码:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::vector<int> intVec;
auto it = intVec.begin();//这里定义了迭代器
intVec.push_back(1);
intVec.push_back(2);
//这里想打印刚刚插入的元素,但由于迭代器失效,程序会直接崩溃
for (; it != intVec.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
2.迭代器失效,更新迭代器,运行正常:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::vector<int> intVec;
auto it = intVec.begin();//这里定义了迭代器
intVec.push_back(1);
intVec.push_back(2);
it = intVec.begin();//更新一下迭代器的值就正常了
for (; it != intVec.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
3.迭代器失效,重新定义迭代器,运行正常:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
std::vector<int> intVec;
auto it = intVec.begin();//这里定义了迭代器
intVec.push_back(1);
intVec.push_back(2);
auto it1 = intVec.begin();//重新定义迭代器,运行正常
for (; it1 != intVec.end(); ++it1)
{
cout << *it1 << endl;
}
return 0;
}
猜你喜欢
- 2025-01-04 C++ 中 push_back 和 emplace_back 的区别
- 2025-01-04 c++ STL vector迭代器失效的几种情况
- 2025-01-04 c++ STL map vector插入时间复杂度
- 2025-01-04 【C++编程语言】vector容器 概念 构造 赋值 容量判断 插入 删除 互换
- 2025-01-04 C++|6种方法分割或分行处理string存储到STL vector
- 2025-01-04 「C/C++」之数组、vector对象和array对象的比较
- 2025-01-04 你真的会用C++中map和vector的erase方法吗?
- 2025-01-04 c++ vector的六种创建和初始化方法
- 2025-01-04 C++遍历vector元素的四种方式
- 05-22Linux cron任务计划
- 05-22测试人员如何在linux服务器中查询mysql日志?
- 05-22Nginx命令最全详解(29个最常用命令)
- 05-22初识自动化网络编排器NSO,轻松配置复杂的多厂商网络
- 05-22Nacos在企业生产中如何使用集群环境?
- 05-22如何从 MySQL 错误日志中排查数据库故障
- 05-22Linux面试最高频的5个基本问题
- 05-22linux网卡混杂模式
- 最近发表
- 标签列表
-
- jsp (69)
- gitpush (78)
- gitreset (66)
- python字典 (67)
- dockercp (63)
- gitclone命令 (63)
- dockersave (62)
- linux命令大全 (65)
- pythonif (86)
- location.href (69)
- dockerexec (65)
- tail-f (79)
- deletesql (62)
- c++模板 (62)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- console.table (62)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)