2015-08-19 70 views
0

我遇到了這個「向量迭代器不兼容」斷言,我不知道爲什麼。我在這裏看到了幾個答案,但沒有一個幫助。我想知道是否有人能夠發現這個問題。它基本上是一個我深度複製的向量,但是當我遍歷副本時,它斷言。代碼是有點混亂,但我不能再親一個簡單的情況:向量迭代器在深度複製向量時不兼容

#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

回答

1

不要在std::vector使用memset

你不知道std::vector的內部是什麼,所以你不應該把它們歸零。如果您需要清除矢量,請使用clear方法。

即使對於只有指針的類,也不要使用memset,使構造函數將指針設置爲NULL。

1

我的猜測是memset是跺腳內部向量狀態。嘗試刪除它,看看它是否通過。我遇到了這個確切的問題。 See this question。接受的答案解釋。