C 中遍歷容器物件時需要注意的問題

2021-05-23 07:57:10 字數 1468 閱讀 5870

假設有這樣乙個管理物件的容器 actormanager,其實現大概為

class actor;

class actormanager

}void add(actor* actor)

void remove(actor* actor)

private:

typedef std::map actors_t;

actors_t m_actors;

};

而actor類的實現是這樣:

class actor

有一天,在給actor新增邏輯的時候,update函式變成了這樣

void update()

再往下

然後……

private:

void die()

在寫下actormanager的時候並沒有想到會在update迴圈裡刪除物件,而實際上卻有幾次遇到類似的問題。
有些問題沒有這麼明顯,但也都是出在遍歷容器物件的過程中,某個執行函式刪除了視窗裡的物件,從而導致迭代器失效。
修改的方法很簡單,給actormanager新增乙個待刪除物件列表
在remove方法中並不真正刪除物件,而是等到update中迴圈結束後再刪除物件。
**看起來會是這樣:
class actor;

class actormanager

m_is_looping = false;

if (!m_removed_actors.empty())

m_removed_actors.clear();}}

void add(actor* actor)

void remove(actor* actor)

private:

typedef std::map actors_t;

actors_t m_actors;

typedef std::vector removed_actors_t;

removed_actors_t m_removed_actors;

bool m_is_looping;

};

沒有給add也加保護的原因是,不會在update函式內向actormanager新增新物件。

當然,有可能在其他地方會有這樣的需求,同樣也做類似的保護即可。

問題雖然不大,但是幾次碰到類似的錯誤了。記錄之,並強制要求自己,

在遇到會對容器內的物件做for…處理時,一定要謹慎的檢查一下remove介面。

配置時需要注意的

搭建的時候肯定不會在同一臺主機上搭建。大多都是在不同的伺服器上安裝不同的角色 追蹤器主機上的 配置檔案填寫的是 當前主機的ip 儲存節點主機上的 bind addr 填的就是當前主機的ip 配置中tracker server 填的蹤器的ip和埠 儲存節點的輪詢 就是在新增一次tracker serv...

Object c block需要注意的幾點問題

摘自 date 2015 12 4 1.block定義 1 說明 a.block是oc中的一種資料型別,在ios開發中被廣泛使用 b.是block的特有標記 c.block的實現 包含在 之間 d.大多情況下,以內聯inline函式的方式被定義和使用 e.block與c語言的函式指標有些相似,但使用...

使用blueZ進行藍芽程式設計時需要注意的問題

一 不要用到哪個bluez標頭檔案中定義的內容就只去包含這個標頭檔案。而應該將bluetooth bluetooth.h最先加入。類似 include btproto hci include struct hci dev info include hci devid include l2cap in...