繁体   English   中英

向量迭代器在分配重载中不兼容

[英]Vector iterators incompatible in assignment overload

这里的简单问题。 我在这里处理向量的分配问题。 我有一个类,库存:

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的=重载。 但是,使用MSVC似乎会出现断言失败,特别是“向量迭代器不兼容”。 奇怪的是,这发生在clear()上。 我不知道这是怎么回事。 如果有人可以给我一些帮助,那就太好了。

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

clientNum = newcl - svs.clients;

这正是导致我断言的原因。

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

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

(当然,如果您不编写自己的operator= ,则编译器将为您生成此代码,并且您还可以通过items = rtSide.items;复制向量items = rtSide.items; -我在帖子中的观点更多是指出“迭代器没有任何问题,只是您没有复制正确的内容”)。

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

(而且我相信xxxx_t类型是为POSIX保留的,因此您不应该真正调用类型xxxx_t

我怀疑您的指针算法导致尝试调用Inventory上的赋值运算符,但是指针实际上并未指向Inventory (例如,它可以指向delete 'd Inventory )如果是这样的情况下, vector的胆可填充有随机垃圾,这可能导致这些种断言故障。

例如,您的呼叫者可能在道德上等同于:

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

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

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

暂无
暂无

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

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