簡體   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