Dev Environment — 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: я только что понял, что, насколько я помню, мы видели эту проблему только с объектами, которые являются членами стандартного вектора. Есть ли что-то, что мы могли облажаться в нашей векторной реализации, что могло вызвать такое поведение?
original - 1
. - person Kerrek SB   schedule 26.01.2012original
он, вероятно, имеет в виду исходный адрес объекта, интерпретируемый как целое число - person Seth Carnegie   schedule 26.01.2012