我们知道vector是以一段连续的空间来存储元素的,当然这不是今天的重点,今天要说的是如果我们在不加锁的情况下使用遍历器,会有什么后果。
代码如下:
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;
int main(int argc, char* argv[])
{
vector<int> vct_tmp;
vct_tmp.reserve(2);
vct_tmp.push_back(1);
vector<int>::const_iterator iter = vct_tmp.begin();
vct_tmp.push_back(2);
cout << "value:" << *iter << endl;
}
执行结果:

嗯,没啥问题,继续。
现在的代码如下:
#include <iostream>
#include <vector>
using std::vector;
using std::cout;
using std::endl;
int main(int argc, char* argv[])
{
vector<int> vct_tmp;
vct_tmp.reserve(2);
vct_tmp.push_back(1);
vector<int>::const_iterator iter = vct_tmp.begin();
vct_tmp.push_back(2);
vct_tmp.push_back(3);
vct_tmp.push_back(4);
cout << "value:" << *iter

本文探讨了在C++中使用STL vector时,如果不加锁进行遍历可能出现的问题。当vector需要扩容时,旧的遍历器可能会指向已被释放或重置的内存,导致错误的输出。对于类类型如string,其析构过程会重置空间,而对于基本类型如int,仅释放内存但不会重置,仍可通过旧地址访问到正确值,但这样做并不安全。通过实践验证,访问超出原大小的元素将得到错误值,强调了初始化和并发安全的重要性。
最低0.47元/天 解锁文章
873

被折叠的 条评论
为什么被折叠?



