我在C ++程序中执行时遇到错误(矢量迭代器不兼容),我不明白。 [(Windows / Visual C ++ 2008 Express)]
以下是我的问题的简化版本:
#include <vector>
class A
{
int mySuperInt;
public:
A(int val) : mySuperInt(val) {}
};
class B
{
std::vector<A*> myAs;
public:
B()
{
myAs.push_back(new A(1));
};
const std::vector<A*> getA() const {return myAs;}
};
int main()
{
std::vector<B>* myBs = new std::vector<B>;
myBs->push_back(B());
std::vector<B>::const_iterator it_B = myBs->begin();
for ( ; it_B != myBs->end(); ++it_B)
{
std::vector<A*>::const_iterator it_A = it_B->getA().begin();
for ( ; it_A != it_B->getA().end(); ++it_A) // <-- Error during execution: vector iterator incompatibles
{
// Do stuff
// ...
}
}
}
我错过了什么吗?
提前感谢您的回答。
答案 0 :(得分:6)
您的getA()
函数按值返回向量。您正在将循环迭代器初始化为该向量的开头,但由于返回的向量是临时的,因此它会在该行的末尾被销毁。
// at the end of this line the vector returned by getA is gone, so it_A is invalid.
std::vector<A*>::const_iterator it_A = it_B->getA().begin();
因此迭代器不再有效。您应该返回对此向量的引用(请注意&
):
const std::vector<A*> & getA() const {return myAs;}
答案 1 :(得分:1)
您意识到B :: getAs()返回其myAs的副本。因此,it_A范围的向量是与getA()。end()保持比较的向量不同的副本。 for循环永远不会停止。 (更糟糕的是,it_A范围超过了矢量&lt;&gt;这是一个临时的,所以它被破坏了,当你假装迭代它时,各种随机垃圾可以写在那个存储上。)
答案 2 :(得分:1)
感谢完整而简单的复制。这里的问题是你正在使用来自2个不同向量的迭代器,这是一个运行时调试检查。
您可能不打算这样做,但它是getA的返回类型的结果。
您正在返回该向量的副本,您可能想要返回对该向量的引用,如下所示:
const std::vector<A*>& getA() const {return myAs;}