Указатели как-то недействительны, что приводит к нарушению прав доступа - PullRequest
2 голосов
/ 26 января 2012

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

Ответы [ 2 ]

0 голосов
/ 26 января 2012

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

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

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

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

0 голосов
/ 26 января 2012

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

...