Среда разработки - VS2010, и язык смешанный C # (GUI) и C ++ (Sim Engine), компилируемый для 32-битной Windows. Исключения встречаются в каждой версии Windows, с которой мы тестировали, включая 32-битную XP, 32-битную Vista, 32-битную 7 и 64-битную 7.
Я в полном недоумении с этим. Из-за характера программы (моделирование на основе событий) указатель становится недействительным в какой-то неизвестный момент времени, прежде чем мы на самом деле пытаемся получить к нему доступ и получить AVE.
Что я делаю знаю, так это то, что оно признано недействительным особым образом, и я надеюсь, что кто-то там может иметь представление о том, что может вызвать это. Когда происходит AVE, указатель, который он пытался использовать, был изменен на:
(original) - ((size * 2) - 1)
Где original
- исходный адрес, на который указывает указатель, а size
- размер объекта, на который указывает указатель.
Например, одно из нарушений доступа произошло с указателем, который должен указывать на 0x58E0
, а объект имел размер 0x70
. Вместо указания на 0x58E0
, оно указывало на 0x5801
, что составляет 0x58E0 - ((0x70 * 2) - 1)
. То же самое происходит с другим объектом другого типа и размера, поэтому, похоже, это очень специфические отношения.
Редактировать: Выше я не говорю о выполнении арифметики указателей в коде, я лишь показываю математическую связь между тем, каким должен быть указатель, и тем, чем он заканчивается когда мы ссылаемся на него и получаем исключение нарушения прав доступа. Надеюсь, это прояснит ситуацию.
Редактировать 2: Я только что понял, что, насколько я помню, мы видели эту проблему только с объектами, которые являются членами стандартного вектора. Есть ли что-то, что мы могли бы испортить в нашей векторной реализации, которая могла бы вызвать такое поведение?