Повреждение кучи при чтении / записи пользовательской карты в многопоточном приложении - PullRequest
0 голосов
/ 28 декабря 2011

У меня есть свой настраиваемый класс карты

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


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

Я перечисляю устройство Wi-Fi с использованием Bonjour Api.

У меня есть две темы

Основная тема:

  1. Добавление дескриптора и сокета в карту ClientSocketMap, когда обратный вызов Bonjour API возвращает сокет и дескриптор для обработки.
  2. Я удаляю запись, когда у сокета нет данных для приема

Поток обработки обратного вызова:

  1. Я делаю select, чтобы проверить, есть ли в сокете что-то, и затем нажимаю обратный вызов Bonjour.

  2. Яиспользуя секцию Crtical для выполнения добавления и удаления на ClientSocketMap

Но, к моему удивлению, он показывает повреждение кучи в потоке обработки обратного вызова, когда он пытается проиндексировать дескриптор ClientSocketMap.

Я не понимаю, почему я получаю эту ошибку. Это из-за потока?Помогите мне решить проблему.

1 Ответ

0 голосов
/ 28 декабря 2011

Проверьте оператор == () в реализации DNSServiceRef. Также эта реализация класса основана на массиве, и каждый раз, когда вы добавляете новый элемент, некоторые старые элементы будут перемещаться.Может быть, вы используете старые указатели.После того, как каждое «добавление» ваших указателей аннулируется

MSDN: каждая добавленная пара ключей и значений приводит к освобождению и перераспределению памяти сопоставляющего массива, чтобы гарантировать, что данные для каждого из них всегда сохраняются непрерывно.

...