繁体   English   中英

std :: vector迭代器不兼容

[英]std::vector iterator incompatibles

在我不理解的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
            // ...
        }
    }
}

我错过了什么吗?

预先感谢您的回答。

您的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;}

您意识到B :: getAs()返回其myAs的副本。 因此,it_A范围内的向量与它的getA()。end()一直与之进行比较的向量是一个不同的副本...即for循环永远不会停止。 (更糟糕的是,it_A的范围是一个临时的vector <>,因此它被破坏了,并且在您假装对其进行迭代时,各种随机废话都可以写在该存储上。)

感谢您完整而简单的复制。 这里的问题是您正在使用来自2个不同向量的迭代器,这是运行时调试检查。

您可能不打算这样做,但这是getA返回类型的结果。

您正在返回向量的副本,并且可能要返回对该向量的引用,如下所示:

const std::vector<A*>& getA() const {return myAs;}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM