我遇到了这个“矢量迭代器不兼容”的断言,我不明白为什么。我在这里看了几个答案,但没有一个帮助。我想知道是否有人能发现这个问题。它基本上是一个我正在深度复制的向量,但是当我遍历副本时,它断言。代码有点令人困惑,但我不能用更简单的案例重新编写代码:
#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 :(得分:1)
不要在memset
上使用std::vector
。
你不知道std::vector
的内部是什么,所以你不应该把它们归零。如果需要清除向量,请使用clear
方法。
即使对于只有指针的类,也不要使用memset,使构造函数将指针设置为NULL。
答案 1 :(得分:1)
我的猜测是memset
正在踩内部矢量状态。尝试删除它,看看它是否通过。我遇到了这个问题。 See this question。接受的答案解释了。