假設有這樣乙個管理物件的容器 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...