上一篇已经给大家分享了《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;
}