我迷路了: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/