深度复制向量时,向量迭代器不兼容

时间:2015-08-19 00:54:42

标签: c++ vector stl

我遇到了这个“矢量迭代器不兼容”的断言,我不明白为什么。我在这里看了几个答案,但没有一个帮助。我想知道是否有人能发现这个问题。它基本上是一个我正在深度复制的向量,但是当我遍历副本时,它断言。代码有点令人困惑,但我不能用更简单的案例重新编写代码:

#include <vector>    
class MyClass
{
 public:
MyClass() {};
~MyClass() {};
virtual MyClass* Clone()
{
    MyClass* clone = new MyClass(*this);
    return clone;
}
int GetData() const { return m_data; }
 private:
int     m_data;

};

typedef std::vector<MyClass*> MyClassList;

struct MyStruct
{
    MyClassList myClassList;
};
struct MyStruct2
{
    MyStruct2() {};
    MyStruct *pData2;
};
int _tmain(int argc, _TCHAR* argv[])
{
    MyClassList* m_pMyClasssOrig;
    m_pMyClasssOrig = new MyClassList();
    m_pMyClasssOrig->push_back(new MyClass());
    m_pMyClasssOrig->push_back(new MyClass());
    m_pMyClasssOrig->push_back(new MyClass());

    // Setup worker parameters
    MyStruct2*        pWorkerParam  = new MyStruct2();
    MyStruct*        pData2         = new MyStruct();

    memset(pWorkerParam, 0x00, sizeof(MyStruct2));
    memset(pData2, 0x00, sizeof(MyStruct));
    pWorkerParam->pData2 = pData2;

    // Make deep copy of the myClassList
    for (auto pMyClass : *m_pMyClasssOrig)
    {
        auto decoderCopy = pMyClass->Clone();
        pWorkerParam->pData2->myClassList.push_back(decoderCopy);
    }
    // why do I get "Expression: vector iterators incompatible"
    // here?
    for (auto i = pWorkerParam->pData2->myClassList.begin(); i !=  pWorkerParam->pData2->myClassList.end(); i++)
    {
        MyClass*    pMyClass = *i;
       (void)pMyClass->GetData();
    }
    return 0;
}

2 个答案:

答案 0 :(得分:1)

不要在memset上使用std::vector

你不知道std::vector的内部是什么,所以你不应该把它们归零。如果需要清除向量,请使用clear方法。

即使对于只有指针的类,也不要使用memset,使构造函数将指针设置为NULL。

答案 1 :(得分:1)

我的猜测是memset正在踩内部矢量状态。尝试删除它,看看它是否通过。我遇到了这个问题。 See this question。接受的答案解释了。