2012-01-26 2 views
2

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-вектора. Есть ли что-то, что мы могли бы испортить в нашей векторной реализации, которая могла бы вызвать такое поведение?

+0

При выполнении арифметики указателя единица измерения является единицей одного объекта, а не одного байта. Поэтому умножение на размер кажется проблематичным; дважды проверьте, что вы понимаете арифметику указателя. Возможно, вы просто имеете в виду «оригинал - 1». –

+1

@KerrekSB по переменной 'original' он, вероятно, означает исходный адрес объекта, интерпретируемого как целое число –

+1

Прошу прощения, я не был достаточно ясен в сообщении. Я не делаю никакой арифметики указателя в коде, это было только для того, чтобы показать математическую взаимосвязь между тем, что должен быть указатель _should_, и тем, чем он заканчивается, когда мы пытаемся ссылаться на (сейчас) неверный указатель и получать нарушение доступа Исключение. – gtftw

ответ

0

Характер коррупции предполагает, что кто-то испортил использование realloc.

+0

Я просто сделал «Найти» в VS для «realloc», и он ничего не нашел, поэтому мы не вызываем его напрямую. В случае, если это имеет какое-либо значение, насколько я могу думать, похоже, эта проблема была видна только с объектами, которые являются членами векторов. Что бы я мог найти в нашей векторной реализации, которая могла бы вызвать такую ​​проблему? – gtftw

+0

Там вы идете. Векторные вызовы realloc. Попробуйте вместо этого сохранить указатели на объекты в Vector. – Joshua

0

Я просто понял, что, насколько я помню, мы видели эту проблему только с объектами, являющимися членами std-вектора. Есть ли что-то, что мы могли бы испортить в нашей векторной реализации, которая могла бы вызвать такое поведение?

Это не проблема с векторной реализацией, это проблема с тем, как вы ее используете.

vector наиболее определенно аннулирует итераторы и указатели на существующие объекты всякий раз, когда он увеличивает свою емкость. Специфические математические отношения, которые вы видите, будут связаны с шаблоном роста вашей конкретной реализации.

Решение не должно содержать указатель на содержимое вектора, в то время как размер вектора меняется. Вы можете сохранить указатель на вектор и индекс, который будет оставаться действительным.

+0

Я должен был быть более конкретным: наш вектор хранит указатели только на объекты. В чем дело, о чем вы говорите? Кроме того, это произошло, по крайней мере, один раз с объектом, на который указывал вектор, который только когда-либо имеет 1 член в течение всей продолжительности сценария. – gtftw

+0

@gtftw: Я не вижу, как это "объекты, которые являются членами' std :: vector' ". Если у вас есть указатель, а также есть копия этого указателя в векторе, то вектор не имеет к этому никакого отношения. Или указатель, сохраненный в изменяющемся векторе? –