C++ 向量迭代器在深度复制向量时不兼容

C++ 向量迭代器在深度复制向量时不兼容,c++,vector,stl,C++,Vector,Stl,我遇到了这个“向量迭代器不兼容”断言,我不知道为什么。我在这里看了几个答案,但没有一个有用。我想知道是否有人能发现这个问题。这基本上是一个向量,我在深度复制,但当我在副本中迭代时,它断言。代码有点混乱,但我无法用一个更简单的例子来重新编写pro: #include <vector> class MyClass { public: MyClass() {}; ~MyClass() {}; virtual MyClass* Clone() { MyClass* clon

我遇到了这个“向量迭代器不兼容”断言,我不知道为什么。我在这里看了几个答案,但没有一个有用。我想知道是否有人能发现这个问题。这基本上是一个向量,我在深度复制,但当我在副本中迭代时,它断言。代码有点混乱,但我无法用一个更简单的例子来重新编写pro:

#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;
}
#包括
类MyClass
{
公众:
MyClass(){};
~MyClass(){};
虚拟MyClass*克隆()
{
MyClass*克隆=新的MyClass(*此);
返回克隆;
}
int GetData()常量{return m_data;}
私人:
int m_数据;
};
typedef std::vector MyClassList;
结构MyStruct
{
MyClassList MyClassList;
};
结构MyStruct2
{
MyStruct2(){};
MyStruct*pData2;
};
int _tmain(int argc,_TCHAR*argv[]
{
MyClassList*m_pMyClasssOrig;
m_pMyClasssOrig=新的MyClassList();
m_pMyClasssOrig->push_back(新的MyClass());
m_pMyClasssOrig->push_back(新的MyClass());
m_pMyClasssOrig->push_back(新的MyClass());
//设置工作参数
MyStruct2*pWorkerParam=新的MyStruct2();
MyStruct*pData2=新的MyStruct();
memset(pWorkerParam,0x00,sizeof(MyStruct2));
memset(pData2,0x00,sizeof(MyStruct));
pWorkerParam->pData2=pData2;
//制作myClassList的深度副本
用于(自动pMyClass:*m_pMyClasssOrig)
{
自动解码复制=pMyClass->Clone();
pWorkerParam->pData2->myClassList.push_back(解码复制);
}
//为什么会出现“表达式:向量迭代器不兼容”
//这里?
对于(自动i=pWorkerParam->pData2->myClassList.begin();i!=pWorkerParam->pData2->myClassList.end();i++)
{
MyClass*pMyClass=*i;
(void)pMyClass->GetData();
}
返回0;
}

不要在
std::vector
上使用
memset

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


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

我猜
memset
正在践踏内部向量状态。试着移除它,看看它是否通过。我遇到了这个问题。接受的答案解释了这一点。

请参阅。除非您的对象类型是(并且
MyStruct
不是,因为它的
std::vector
不是),否则代码的结果行为是未定义的。