向量迭代器在赋值重载中不兼容

时间:2013-09-07 16:30:05

标签: c++ vector

这里的问题很简单。我正在处理一些带向量的赋值问题。 我有一个班级,库存:

class Inventory
{
public:
    __inline void operator=( const Inventory& rtSide )
    {
        items.clear();
        for(auto it=rtSide.items.begin(); it!=rtSide.items.end(); ++it)
        {
            items.push_back(*it);
        }
    }
private:
    std::vector<void*> items;
}

有一个包含类的结构:

typedef struct
{
    Inventory *inventory;
} player_t;

在player_t的指针上分配/执行指针数学运算时,会调用Inventory's = overload,正如您所期望的那样。但是,使用MSVC,似乎存在断言失败,特别是“矢量迭代器不兼容”。奇怪的是,这发生在clear()上。我不知道这里有什么。如果有人可以给我一些很好的帮助。

这是一个正在发生的事情的例子。使用指针数学,我们可以通过从基数中减去当前客户端的播放器结构来确定客户端编号:

clientNum = newcl - svs.clients;

这特别是导致我断言的原因。

2 个答案:

答案 0 :(得分:0)

我很确定您要复制rtSide列表中的项目,而不是this中的项目。

    items.clear();
    for(auto it=rtSide.items.begin(); it!=rtSide.items.end(); ++it)
    {
        items.push_back(*it);
    }

(当然,如果你没有编写自己的operator=,编译器会为你生成这个代码,你也可以通过items = rtSide.items;复制一个向量 - 我的观点是帖子更多指出“你的迭代器没有任何问题,你只是没有复制正确的东西”。)

我还要说使用vector<void *>几乎是“以C语言使用C ++”。您应该至少存储一个指向基类的指针,如果不是指向基类的智能指针。基类可能类似于“inventry_item”之类的东西。

(我相信xxxx_t类型是为POSIX保留的,所以你不应该真正调用你的类型xxxx_t

答案 1 :(得分:0)

我怀疑你的指针算法导致试图在Inventory上调用赋值运算符,但指针实际上并不指向Inventory。 (例如,它可能指向delete'd Inventory)如果是这种情况,vector的内容可能会被随机垃圾填充,这可能会导致这类断言失败。

例如,您的来电者可能会做道德等同于:

Inventory out;
Inventory* target = nullptr;
*target = out;

可能导致这类断言失败。检查调用赋值运算符的代码。

(另请注意,您的赋值运算符不处理对self的赋值;但在这种情况下,它只会清除Inventory,而不会导致断言失败)