Местоположение чтения нарушения прав доступа на std :: set :: erase - PullRequest
0 голосов
/ 05 октября 2009

Я недавно обнаружил следующую ошибку в моем приложении:

m_players[0].erase(plr); -- CRASHES HERE

m_players[1].erase(plr);

m_players объявлено как:

set<PlayerPointer> m_players[2];

Visual Studio показывает, что это «0xC0000005: место записи нарушения прав доступа 0x0000000000000024.»

Компилятор: Visual Studio 2008.

Сборка: 000000014007AA3B mov rcx, qword ptr [this] (разбился)

Так что я предполагаю, что мы умираем из-за плохого «this», так как это первый доступ к этому в этой функции. Но так как я смотрел local / autos, это не плохой указатель.

Было бы неплохо получить подсказку.

Ответы [ 4 ]

2 голосов
/ 05 октября 2009

Что-то указывает на 0. Когда вы используете Visual Studio, скомпилируйте ваше приложение в режиме отладки. Введите Ctrl + Alt + E и активируйте исключения, когда они будут выброшены. Это поможет вам обнаружить места, где что-то пойдет не так, перед запуском обработчика исключений. Затем вы можете опубликовать стек вызовов, но я думаю, что вы сами легко увидите и решите проблему. Я могу вообразить что-то плохое в деструкторе любого типа, plr.

1 голос
/ 26 марта 2011

При работе с Visual Studio всегда хорошо убедиться, что время выполнения одинаково. Вы это подтвердили? (например, многопоточная отладочная DLL (/ MDd))

0 голосов
/ 05 октября 2009

есть ли вероятность, что массив является глобальным, и проблемный код выполняется до инициализации массива (может произойти, если он находится внутри конструктора глобального объекта и т. Д.)?

0 голосов
/ 05 октября 2009

Я думаю, что это связано с тем, что plr уже удален или недоступен. Можете ли вы показать, как вы получаете plr, это локальная переменная или она передается в качестве аргумента? Возможно, вы захотите создать локальную переменную, а затем использовать ее в функции стирания и посмотреть, не сработает ли она. Таким образом, вы можете точно определить причину сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...