向量迭代器在深度复制向量时不兼容
问题描述:
我遇到了这个“向量迭代器不兼容”断言,我不知道为什么。我在这里看到了几个答案,但没有一个帮助。我想知道是否有人能够发现这个问题。它基本上是一个我深度复制的向量,但是当我遍历副本时,它断言。代码是有点混乱,但我不能再亲一个简单的情况:向量迭代器在深度复制向量时不兼容
#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;
}
答
不要在std::vector
使用memset
。
你不知道std::vector
的内部是什么,所以你不应该把它们归零。如果您需要清除矢量,请使用clear
方法。
即使对于只有指针的类,也不要使用memset,使构造函数将指针设置为NULL。
请参阅[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