C++ 迭代器随机失效

标签 c++ function iterator call invalidation

我迷路了:std::string vector 的迭代器可以完美工作,除非在它++之前有一个函数调用 (Z_UB->set() )。这是代码:

std::vector< std::string >::iterator it = g_SPP.scenarios->getVector().begin();
std::cout << "begin of vector: " << *it << std::endl;
Z_UB->set("s1", "scn2", 350);
it++;
std::cout << "second of vector: " << *it << std::endl;

创建以下输出

begin of vector: scn1

但是,如果我像这样移动函数调用:

std::vector< std::string >::iterator it = g_SPP.scenarios->getVector().begin();
std::cout << "begin of vector: " << *it << std::endl;
it++;
std::cout << "second of vector: " << *it << std::endl;
Z_UB->set("s1", "scn2", 350);

结果如下,这是预期的行为:

begin of vector: scn1
second of vector: scn2

在 Z_UB->set() 函数内部,除了调用本身什么都没有:

void Parameter::set( std::string _i, std::string _j, float value) {
//int i = indexSets[0]->backIndex(_i);
//int j = indexSets[1]->backIndex(_j);

//data2D[0][0] = value;
}

因此,如果我在创建迭代器后调用 Z_UB->set() 函数,访问它会使程序崩溃。关于迭代器,我是否遗漏了什么重要的东西?

最佳答案

几种可能性:

  • 要么你没有一个很好的可重现的例子:也许在你的第一次运行中你的 vector 中只有一个元素(它是如何填充的?),并且调用了未定义的行为因为你没有检查 针对 g_SPP.scenarios->getVector().end()
  • 或者Z_UB->set 没有按照您的想法去做。它是一个多态类吗? set 是虚拟的吗? -> 运算符是否重载?
  • 您的应用是否是多线程的并且另一个线程正在改变您的容器?

关于C++ 迭代器随机失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8403047/

相关文章:

c++ - Qt Widget 与树组织的项目

c++ - 使用 MSVC10 编译 x64 C++ 时使用 ASM

C程序给出奇怪的输出

c - 将结构指针传递给 C 中的函数时出现奇怪的错误

python - 如何在Python中的for循环中创建多个迭代器和条件?

C++:修改一个类在另一个类中的私有(private)属性

c++ - C++ 中的 NAPI native 模块正在部分执行(包括 std::thread)

python - 遍历列表并在 Python 中漂亮地处理 StopIteration

Python:如何使变量 = 1 并且它在不同的 def block 中仍然如此? (对于游戏)

c++ - 从只能访问迭代器的 std::list 中删除项目