繁体   English   中英

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

[英]vector iterators incompatible when deep copying vectors

我遇到了这个“向量迭代器不兼容”的断言,我也不知道为什么。 我在这里看了几个答案,但没有一个有帮助。 我想知道是否有人可以发现问题。 从本质上讲,它是我要深复制的向量,但是当我遍历副本时,它会断言。 代码有点混乱,但是我无法用更简单的情况重新编程:

#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。

我的猜测是memset在内部向量状态上踩踏。 尝试删除它,看看是否通过。 我遇到了这个确切的问题。 看到这个问题 接受的答案说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM