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

问题描述:

我遇到了这个“向量迭代器不兼容”断言,我不知道为什么。我在这里看到了几个答案,但没有一个帮助。我想知道是否有人能够发现这个问题。它基本上是一个我深度复制的向量,但是当我遍历副本时,它断言。代码是有点混乱,但我不能再亲一个简单的情况:向量迭代器在深度复制向量时不兼容

#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; 
} 
+0

请参阅[std :: memset']文档(http://en.cppreference.com/w/cpp/string/byte/memset)。除非你的对象类型是[* trivially copyable *](http://en.cppreference.com/w/cpp/concept/TriviallyCopyable)(并且'MyStruct'是* not *,因为它的'std :: vector '不是),您的代码的结果行为是未定义的。 – WhozCraig

不要在std::vector使用memset

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

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

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