Недопустимая операция указателя-Delphi XE

Я, кажется,не могу понять это. Моя программа компилируется и запускается успешно, но во время отладки появляется только окно с сообщением "недопустимая операция указателя" при выключении программы. Я тщательно проверил все события FormCloseQuery и FormDestory на наличие синтаксиса или логической ошибки. Я не нашел ни одного, и они выполняются, как ожидалось, без каких-либо ошибок.

enter image description here

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

Как вы это понять?

заранее спасибо,

4 ответов


недопустимое исключение указателя создается диспетчером памяти при попытке освободить недопустимую память. Это может произойти тремя способами.

наиболее распространенным является то, что вы пытаетесь освободить объект, который вы уже освободили. Если вы включите FullDebugMode FastMM, он обнаружит это и укажет вам непосредственно на проблему. (Но обязательно создайте файл карты, чтобы он имел информацию, необходимую для создания полезных трассировок стека.)

второй путь если вы пытаетесь освободить память, которая была выделена где-то, кроме диспетчера памяти. Я видел это несколько раз, когда проходил строка из Delphi EXE в Delphi DLL, которая не использует функцию диспетчера общей памяти.

и третий способ включает в себя возиться с указателями напрямую и, вероятно, не относится к вам. Если вы попытаетесь FreeMem или Dispose плохой указатель, который не ссылается на фактический блок памяти, выделенный FastMM, вы получите это ошибка.

скорее всего первое. Использовать FullDebugMode и вы легко найдете источник проблемы.


недопустимые операции указателя происходят, когда вы говорите диспетчеру памяти Delphi освободить память, которая ему не принадлежит. Есть три способа, которые могут произойти:

  • освобождение указателя или объекта, который уже был освобожден.
  • используя FreeMem чтобы освободить что-то, что было выделено другим менеджером памяти (например,GlobalAlloc или CoTaskMemAlloc).
  • освобождение неинициализированного указателя. (Это отличается от освобождения нулевого указателя, который полностью безопасный.)

где-то в вашей программе, вы делаете одну из этих вещей. Отладчик обнаружил исключение, вызванное диспетчером памяти, поэтому выполните некоторую отладку. Из трассировки стека вы должны видеть, какую переменную вы пытаетесь освободить. Проверьте остальную часть вашей программы на другие способы использования этой переменной.

инструменты, такие как MadExcept и Eureka Log, могут помочь вам найти двойные ошибки. Они могут отслеживать, где указатель в вопросе получил выделено и где оно было освобождено в первый раз, и этого иногда достаточно, чтобы понять вашу ошибку и перестать освобождать вещи несколько раз.


4-я причина может произойти недопустимая операция указателя. У меня было два указателя, где array[0..1000] реального и третьего указателя, который был массивом[1..200] из реальных. Все 3 указателя, инициализированные с помощью для i: = от 0 до 1000 do начинать ptr1 выглядит следующим образом^[Я]:=0;ptr2^[я]:=0;ptr3^[я]:=0; конец; Хотя это плохое Программирование не беспокоило Паскаля в Delphi, вызов для удаления любого из 3 указателей привел к недопустимой операции указателя. Исправить было просто правильно инициализировать 3-й указатель.


Я был пойман этим типом "указанной ошибки" во время отладки Delphi.

проверьте, есть ли у вас наблюдаемые переменные с включенными "Разрешить вызовы функций" или часы, которые пытаются показать другие переменные в том же блоке (или глобальном), которые могут быть неинициализированы. При остановке в точке останова отладчик Delphi может попытаться отобразить значение с помощью вызова функции, которая обращается к неинициализированному указателю или переменной. Фактическая переменная, которая вызывает AV my даже не быть в твоем списке.