Dev Environment - это VS2010, а язык смешанный C# (GUI) и C++ (Sim Engine), компиляция для 32-разрядной Windows. Исключения происходят в каждой версии Windows, с которой мы тестировали, включая 32-разрядные XP, 32-разрядные Vista, 32-разрядные 7 и 64-разрядные 7.Указатели недействительны каким-то образом, что приводит к нарушению доступа
Я полностью в убытке с этим. Из-за характера программы (моделирования на основе событий) указатель недействителен в какой-то неизвестный момент времени, прежде чем мы попытаемся получить к нему доступ и получить AVE.
Что такое do знаю, что он признан недействительным совершенно определенным образом, и я надеюсь, что кто-то может иметь представление о том, что может вызвать это. Когда AVE происходит, указатель, что он пытался использовать было изменено:
(original) - ((size * 2) - 1)
Где original
оригинальный адрес, на который указывает указатель, и size
является размер объекта указывает на.
Например, один из нарушений доступа произошла на указатель, который должен указывают на 0x58E0
и объект имел размер 0x70
. Вместо указания на 0x58E0
он указал на 0x5801
, который равен 0x58E0 - ((0x70 * 2) - 1)
. То же самое происходит с другим объектом другого типа и размера, поэтому это, по-видимому, очень специфические отношения.
Edit: Выше я не говорить о выполнении арифметических операций над указателями в коде, я только показываю математическую связь между тем, что указателем должен быть и то, что он заканчивает тем, что, как, когда мы ссылаемся его и получить Исключение нарушения доступа. Надеюсь, что это прояснит ситуацию.
Редактировать 2: Я просто понял, что, насколько я помню, мы видели эту проблему только с объектами, являющимися членами std-вектора. Есть ли что-то, что мы могли бы испортить в нашей векторной реализации, которая могла бы вызвать такое поведение?
При выполнении арифметики указателя единица измерения является единицей одного объекта, а не одного байта. Поэтому умножение на размер кажется проблематичным; дважды проверьте, что вы понимаете арифметику указателя. Возможно, вы просто имеете в виду «оригинал - 1». –
@KerrekSB по переменной 'original' он, вероятно, означает исходный адрес объекта, интерпретируемого как целое число –
Прошу прощения, я не был достаточно ясен в сообщении. Я не делаю никакой арифметики указателя в коде, это было только для того, чтобы показать математическую взаимосвязь между тем, что должен быть указатель _should_, и тем, чем он заканчивается, когда мы пытаемся ссылаться на (сейчас) неверный указатель и получать нарушение доступа Исключение. – gtftw