Invalid Pointer Operation — Delphi XE
I can’t seem to figure this one out. My program compiles and runs successfully, but during debugging only it pops up a message box saying «Invalid Pointer Operation» when shutting the program down. I have painstakingly checked all the FormCloseQuery and FormDestory events for any syntax or logical error. I found none and they execute as expected without any error.
When I do tell the compiler to break at Invalid Pointer Operation error, it doesn’t do anything but hangs up the program. At which point, I had to terminate or kill the process.
How do you figure this one out?
Thanks in advance,
4 Answers 4
An Invalid Pointer exception is thrown by the memory manager when it tries to free invalid memory. There are three ways this can happen.
The most common is because you’re trying to free an object that you’ve already freed. If you turn on FastMM’s FullDebugMode, it will detect this and point you directly to the problem. (But make sure to build a map file so it will have the information it needs to create useful stack traces from.)
The second way is if you’re trying to free memory that was allocated somewhere other than the memory manager. I’ve seen this a few times when passing a string from a Delphi EXE to a Delphi DLL that wasn’t using the shared memory manager feature.
And the third way involves messing around with pointers directly and probably doesn’t apply to you. If you try to FreeMem or Dispose a bad pointer that doesn’t refer to an actual block of memory allocated by FastMM, you’ll get this error.
It’s most likely the first one. Use FullDebugMode and you’ll find the source of the problem easily.
Sorry, you have been blocked
This website is using a security service to protect itself from online attacks. The action you just performed triggered the security solution. There are several actions that could trigger this block including submitting a certain word or phrase, a SQL command or malformed data.
What can I do to resolve this?
You can email the site owner to let them know you were blocked. Please include what you were doing when this page came up and the Cloudflare Ray ID found at the bottom of this page.
Cloudflare Ray ID: 7a6520b10f8b2d67 • Your IP: Click to reveal 88.135.219.175 • Performance & security by Cloudflare
Недопустимая операция с указателем — Delphi XE
Кажется, я не могу понять это. Моя программа успешно компилируется и запускается, но только во время отладки появляется окно с сообщением «Недопустимая операция указателя» при завершении работы программы. Я тщательно проверил все события FormCloseQuery и FormDestory на наличие синтаксических или логических ошибок. Я не нашел ни одного, и они выполняются, как и ожидалось, без ошибок.

Когда я говорю компилятору остановиться при ошибке Invalid Pointer Operation, он ничего не делает, кроме как зависает в программе. В этот момент мне пришлось завершить или убить процесс.
Как вы это понимаете?
Включите Debug DCU и выполните отключение, пока не найдете причину этой ошибки. Вы работаете с FastMM в режиме полной отладки? — David Heffernan
@DavidHeffernan, 🙂 Я помню, у нас был разговор о FastMM. К сожалению, я не использовал FastMM, так как когда-то тестировал его. Я включу DCU и посмотрю, что произойдет. — ThN
@DavidHeffernan, после перерыва с включенным dcu отладчик остановился в файле System.pas. Немного сбивает с толку, но я думаю, что это из-за одной из причин Мэйсона Уиллера. Думаю, теперь мне нужно снова включить FastMM. — ThN
Установите какой-нибудь трассировщик стека и, возможно, включите один «использовать отладочные DCU». Похоже, у вас есть какой-то блуждающий указатель, который вы пытаетесь освободить два раза. stackoverflow.com/questions/3631987. stackoverflow.com/questions/12505251. stackoverflow.com/questions/2237028. — Arioch ‘The
Если вы «не нашли ничего», то вам нужно поискать получше, потому что, очевидно, is проблема в вашей программе. — Rob Kennedy
4 ответы
Диспетчер памяти создает исключение Invalid Pointer при попытке освободить недопустимую память. Это может произойти тремя способами.
Чаще всего это происходит потому, что вы пытаетесь освободить уже освобожденный объект. Если вы включите FullDebugMode FastMM, он обнаружит это и укажет вам прямо на проблему. (Но обязательно создайте файл карты, чтобы в нем была информация, необходимая для создания полезных трассировок стека.)
Второй способ — если вы пытаетесь освободить память, которая была выделена где-то еще, кроме диспетчера памяти. Я видел это несколько раз, когда проходил string из Delphi EXE в Delphi DLL, которая не использовала функцию диспетчера общей памяти.
И третий способ включает в себя возню с указателями напрямую и, вероятно, к вам не относится. Если вы попытаетесь FreeMem or Dispose плохой указатель, который не ссылается на фактический блок памяти, выделенный FastMM, вы получите эту ошибку.
Это, скорее всего, первое. Используйте FullDebugMode, и вы легко найдете источник проблемы.
ответ дан 11 апр.
Вы абсолютно правы. Ваша первая причина заключается в том, почему моя программа вызывает это уведомление об исключении. Однако он повышается, потому что событие уничтожения моего TForm вызывается более одного раза. Что я не понимаю, почему. — ThN
Если бы мне пришлось предположить, я бы сказал, что ваша форма была создана с владельцем (например, Application; вы использовали Application.CreateForm построить его?), а потом где-то еще вы пытаетесь освободить его вручную. Взгляните на трассировку стека для двух раз его освобождения; они дадут вам представление о том, что происходит. И держи Принцип единоличной собственности Имейте в виду: ваши формы могут принадлежать приложению или вашему коду, но не обоим. — Мейсон Уиллер
Недопустимые операции с указателями возникают, когда вы указываете диспетчеру памяти Delphi освободить память, которая ему не принадлежит. Это может произойти тремя способами:
- Освобождение указателя или объекта, который уже был освобожден.
- . FreeMem чтобы освободить что-то, что было выделено другим менеджером памяти (например, GlobalAlloc or CoTaskMemAlloc ).
- Освобождение неинициализированного указателя. (Это отличается от освобождения нулевого указателя, что совершенно безопасно.)
Где-то в вашей программе вы делаете одну из этих вещей. Отладчик обнаружил исключение, созданное диспетчером памяти, поэтому выполните некоторую отладку. Из трассировки стека вы должны увидеть, какую переменную пытаетесь освободить. Проверьте остальную часть вашей программы на предмет других способов использования этой переменной.
Такие инструменты, как MadExcept и Eureka Log, могут помочь вам найти двойные ошибки. Они могут отслеживать, где данный указатель был выделен и где он был освобожден в первый раз, и иногда этой информации достаточно, чтобы понять вашу ошибку и прекратить многократное освобождение.
Invalid pointer operation что означает
Thrown when an invalid typecast is attempted on a class using the as operator. This error is also thrown when an object or class is typecast to an invalid class or object and a virtual method of that class or object is called. This last error is only detected if the -CR compiler option is used. 222 Variant dispatch error No dispatch method to call from variant. 223 Variant array create The variant array creation failed. Usually when there is not enough memory. 224 Variant is not an array This error occurs when a variant array operation is attempted on a variant which is not an array. 225 Var Array Bounds check error This error occurs when a variant array index is out of bounds. 227 Assertion failed error An assertion failed, and no AssertErrorProc procedural variable was installed. 229 Safecall error check This error occurs is a safecall check fails, and no handler routine is available. 231 Exception stack corrupted This error occurs when the exception object is retrieved and none is available. 232 Threads not supported Thread management relies on a separate driver on some operating systems (notably, Unixes). The unit with this driver needs to be specified on the uses clause of the program, preferably as the first unit ( cthreads on unix).