2011-12-28 52 views
0

自定義地圖我有我的自定義地圖類堆損壞,而讀/寫在多線程應用程序

template <class TKey, class TVal> class CLSimpleMap{}; 


typedef CLSimpleMap<DNSServiceRef/* Descriptor*/,int/*socket*/> ClientSocketMap;      

我歷數使用Bonjour API來WiFi設備。

我有兩個線程

主線程:

  1. 在地圖上添加ClientSocketMap和Decriptor插槽時,卓悅API回調回報插座和描述符進行處理。
  2. 我刪除條目時插座沒有數據接收

回調處理線程:

  1. 我做選擇,檢查插座有東西,然後推卓悅回調。

  2. 我使用Crtical部執行上ClientSocketMap

添加和刪除,但讓我吃驚的是顯示當它試圖索引描述ClientSocketMap回調處理線程堆損壞。

我不明白,爲什麼我得到這個錯誤。這是由於線程? 幫我解決問題。

+0

只是爲了澄清,你是否在兩個線程中使用臨界區? – 2011-12-28 18:40:13

+0

沒有更多的代碼,它是很難幫助。嘗試像valgrind這樣的內存調試器。 – 2011-12-28 19:22:40

+0

@TimoGeusch是的我在這兩個線程中使用 – 2011-12-28 19:27:40

回答

0

在DNSServiceRef實現中檢查運算符==() 另外,這個基於數組的類實現,每次添加新元素時都會移動一些舊元素。也許你使用舊指針。之後的每個「添加」您的指針無效

MSDN:每個鍵和值的對加入使映射陣列中的存儲器被釋放並重新分配,以確保針對每個數據總是連續地存儲。

+0

這個類動態創建內存,當你添加新的元素。 – 2011-12-28 19:30:46

+0

考慮更換容器。 [前面的討論](http://stackoverflow.com/questions/299190/in-what-situations-is-the-atl-csimplearray-a-better-choice-than-catlarray) – Andrew 2011-12-28 20:00:55