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



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

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;

这具体就是导致我断言的原因。

我怀疑您的指针算术导致尝试在Inventory上调用赋值运算符,但指针实际上并没有指向Inventory。(例如,它可能指向delete Inventory)如果是这样的话,vector的内脏里可能会装满随机的垃圾,这可能会导致这种断言失败。

例如,你是呼叫者可能会做道德等价物:

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

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

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

我很

确定您要从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++"。如果不是指向基类的智能指针,则应至少存储一个指向基类的指针。Baseclass 可以是类似"inventry_item"或类似的东西。

(而且我相信xxxx_t类型是为 POSIX 保留的,所以你不应该真的称你的类型为 xxxx_t

最新更新