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,
Wolf
9,6047 gold badges61 silver badges107 bronze badges
asked Apr 11, 2012 at 20:04
10
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.
answered Apr 11, 2012 at 20:30
Mason WheelerMason Wheeler
82.1k50 gold badges268 silver badges477 bronze badges
2
Invalid pointer operations occur when you tell the Delphi memory manager to release memory that doesn’t belong to it. There are three ways that might happen:
- Freeing a pointer or object that has already been freed.
- Using
FreeMem
to free something that was allocated by some other memory manager (such asGlobalAlloc
orCoTaskMemAlloc
). - Freeing an uninitialized pointer. (This is distinct from freeing a null pointer, which is completely safe.)
Somewhere in your program, you are doing one of those things. The debugger has detected the exception thrown by the memory manager, so do some debugging. From the stack trace, you should be able to see which variable you’re trying to free. Check the rest of your program for other ways that variable is used.
Tools like MadExcept and Eureka Log can help you find double-free errors. They can keep track of where the pointer in question got allocated and where it was freed the first time, and that is sometimes enough information to figure out your mistake and stop freeing things multiple times.
answered Jan 18, 2013 at 15:33
Rob KennedyRob Kennedy
161k21 gold badges275 silver badges465 bronze badges
7
A 4th reason an invalid pointer operation can occur. I had two pointers that where array[0..1000] of real and a third pointer that was an array[1..200] of real. All 3 pointers where initialized with
for i := 0 to 1000 do
begin
ptr1^[i]:=0;ptr2^[i]:=0;ptr3^[i]:=0;
end;
While this poor programing did not bother Pascal in Delphi a call to Dispose any of the 3 pointers resulted in an Invalid Pointer Operation. The fix was simply to initialize the 3rd pointer correctly.
answered Sep 23, 2016 at 21:07
I have been caught out by this type of «indicated error» during Delphi debugging.
Check if you have any watched variables with «Allow Function Calls» enabled or watches that try to show other variables in the same unit (or global) that might be uninitialised. When stopping on a breakpoint this can cause Delphi’s debugger to attempt to display the value via a function call that accesses an uninitialised Pointer or variable. The actual variable that causes the AV my not even be on your watch list.
answered Jan 18, 2013 at 14:28
DespatcherDespatcher
1,74512 silver badges18 bronze badges
1
0 / 0 / 0 Регистрация: 05.11.2016 Сообщений: 31 |
|
1 |
|
15.03.2017, 18:15. Показов 24545. Ответов 14
Создаю проект. Самый обычный.
0 |
5537 / 4322 / 1383 Регистрация: 14.04.2014 Сообщений: 19,381 Записей в блоге: 19 |
|
15.03.2017, 22:34 |
2 |
ошибка в проекте
0 |
0 / 0 / 0 Регистрация: 05.11.2016 Сообщений: 31 |
|
15.03.2017, 23:06 [ТС] |
3 |
Не совсем поняла «пока ничего не изменится».
0 |
пофигист широкого профиля 4658 / 3093 / 854 Регистрация: 15.07.2013 Сообщений: 17,841 |
|
16.03.2017, 01:53 |
4 |
Программа в архиве. А она не компилируется. Не хватает модуля ChangePassword
0 |
0 / 0 / 0 Регистрация: 05.11.2016 Сообщений: 31 |
|
16.03.2017, 01:56 [ТС] |
5 |
Да, извиняюсь, не тот вариант работы отправила.
0 |
пофигист широкого профиля 4658 / 3093 / 854 Регистрация: 15.07.2013 Сообщений: 17,841 |
|
16.03.2017, 02:44 |
6 |
Вот этот запускается. Увы. Он тоже не запускается. Ибо не находит файлы Data.DB, Data.Win.ADODB. Не по теме: Какой мусор и с какой помойки вы нам предлагаете?
0 |
5537 / 4322 / 1383 Регистрация: 14.04.2014 Сообщений: 19,381 Записей в блоге: 19 |
|
16.03.2017, 09:15 |
7 |
все запускается. просто по составным именам модулей видно, что версия XE+
0 |
0 / 0 / 0 Регистрация: 05.11.2016 Сообщений: 31 |
|
16.03.2017, 19:37 [ТС] |
8 |
Ошибка появляется в разные моменты работы (именно с незапущенным приложением). Иногда это добавление элемента, иногда изменение св-в элемента, а иногда и просто так (допустим оставить открытым программу на некоторое время).
0 |
0 / 0 / 0 Регистрация: 05.11.2016 Сообщений: 31 |
|
16.03.2017, 19:44 [ТС] |
9 |
Какой мусор и с какой помойки вы нам предлагаете? Это как бы начало моего диплома.
Ибо не находит файлы Data.DB, Data.Win.ADODB. Запускается не в Delphi, а в RAD Studio.
0 |
5537 / 4322 / 1383 Регистрация: 14.04.2014 Сообщений: 19,381 Записей в блоге: 19 |
|
16.03.2017, 21:24 |
10 |
так у вас программа к ошибке никакого отношения не имеет возможно какие-то компоненты у вас стоят кривые при переустановке нужно полностью удалять следы предыдущих версий
0 |
0 / 0 / 0 Регистрация: 05.11.2016 Сообщений: 31 |
|
16.03.2017, 22:13 [ТС] |
11 |
простой uninstall оставляет за собой тучу барахла Я удаляла через панель управления. Это тоже не подходит? Советуете опять переустановить студию?
0 |
500 / 346 / 200 Регистрация: 20.10.2016 Сообщений: 1,101 |
|
16.03.2017, 22:46 |
12 |
Возможно ли, что влияет то, что программа установлена не на диске С или какой-то конфликт с Delphi 7 (она тоже есть на ПК и тоже не на диске С)? У меня на D стоит 10.1 Berlin на С D7, это на работоспособность IDE никак не влияет.
Советуете опять переустановить студию? Пробуйте, только по новым путям/каталогам.
0 |
0 / 0 / 0 Регистрация: 05.11.2016 Сообщений: 31 |
|
16.03.2017, 23:05 [ТС] |
13 |
Пробуйте, только по новым путям/каталогам. А удалять эту как? Через панель управления норм или какое-то стороннее ПО скачать?
0 |
5537 / 4322 / 1383 Регистрация: 14.04.2014 Сообщений: 19,381 Записей в блоге: 19 |
|
17.03.2017, 00:40 |
14 |
здесь на форуме советовали RevoUninstaller
0 |
1436 / 1013 / 228 Регистрация: 31.05.2013 Сообщений: 6,645 Записей в блоге: 6 |
|
17.03.2017, 00:51 |
15 |
здесь на форуме советовали RevoUninstaller Я им и удалял. Потом заходил в папки ProgramFiles, AppData, ProgramData, и дочищал следы, если оставались. Добавлено через 2 минуты
или какой-то конфликт с Delphi 7 По умолчанию D7 устанавливается в папку Borland в ProgramFiles, а новые версии XExx — в папку Embarcadero в ProgramFiles. Они между собой никак не связаны.
0 |
Есть функция на паскалеподобном синтаксисе if oNode <> nil then FreeObject(oNode);
в этой строке при работе возникает ошибка Invalid pointer operation
из описания ясно что:
204 Invalid pointer operation
You will get this if you call Dispose or Freemem with an invalid pointer (notably, Nil).
То есть nil это только один из возможных вариантов, но в этом коде вызов FreeObject априори только тогда, когда объект не nil, в связи с чем вопрос что еще может быть не так с объектом, что его нельзя очистить и как это проверить?
p.s. возможно причина в том что данный объект присваивался к одному и из элементов списка, который очищался перед очисткой данного объекта, то есть объект вроде как существует, а данные уже нет
Приложения написанные на Free Pascal могут генерировать ошибку времени выполнения (Run Time Error) когда в программе обнаруживаются определённые аварийные состояния . Этот документ содержит список возможных ошибок и описание их возможных причин.
1 Invalid function number (Неправильный номер функции)
Была попытка неправильного вызова системной функции.
2 File not found (Файл не найден)
Генерируется при попытке перенаименования, стирания или открытия несуществующего файла.
3 Path not found (Путь(директория) не найден)
Генерируется файловой системой когда путь не существует или неправелен.
Также генерируется при попытке получить доступ к несуществующему файлу.
4 Too many open files (Слишком много файлов открыто)
Максимальное число открытых файлов для вашего процесса было превышено.
Большинство операционных систем ограничивают максимальное число открытых файлов,
и эта ошибка может возникнуть когда этот лимит превышен.
5 File access denied (В доступе к файлу — отказано)
Было запрешено получение доступа к файлу. Эта ошибка может произойти по нескольким причинам:
-
При попытке открыть файл, предназначенный только для чтения или в деиствительности являющиёся директорией, для записи.
-
В данный момент занят или заблокирован другим процессом.
-
При попытке создания файла или директории с именем, которое совпадает с именем уже созданного файла или директории.
-
При попытке чтения из файла, открытого только для записи.
-
При попытке записи в файл, открытый только для чтения.
-
При попытке удалить директорию или файл, когда это не возможно.
-
При неимении прав на доступ к данному файлу.
6 Invalid file handle (Неправильный хэндл файла)
Происходит, когда используемая Вами файловая переменная была обнулена (испорчена); Это говорит о том, что память вашей программы была повреждена.
12 Invalid file access code (Неправильные ключи доступа к файлу)
Генерируется когда процедуры reset или rewrite вызываются с неправильным параметром FileMode.
15 Invalid drive number (Неправильный номер диска)
Генерируется когда в функции Getdir или ChDir был передан неправильный номер диска.
16 Cannot remove current directory (Невозможно удалить текущую директорию)
Генерируется при попытке удалить текущую директорию.
17 Cannot rename across drives (Можно переименовывать файлы только в пределах одного диска)
Вы не можете переименовать файл в файл, находяшиёся на другом диске или в другом разделе.
100 Disk read error (Ошибка чтения с диска)
Генерируется при невозможности произвести чтение с диска. Обычно происходит при попытке чтения данных, после его окончания.
101 Disk write error (Ошибка записи на диск)
Генерируется когда Вы пытаетесь записать данные на переполненый диск.
102 File not assigned (Файл не определён)
Генерируется функциями Reset, Rewrite, Append, Rename и Erase, При передаче в них файловой переменной, для которой не была выполнена функция AssignFile.
103 File not open (Файл не открыт)
Генерируется следующими функциями : Close, Read, Write, Seek, EOf, FilePos, FileSize, Flush, BlockRead, и BlockWrite если файл не был открыт.
104 File not open for input (Файл не открыт для чтения)
Генерируется функциями Read, BlockRead, Eof, Eoln, SeekEof и SeekEoln если файл не был открыт при помощи Reset.
105 File not open for output (Файл не открыт для записи)
Генерируется функцией write если текстовый файл не был открыт при помощи Rewrite.
106 Invalid numeric format(Неправильный числовой формат)
Генерируется когда ожидалось числовое значение, но из текстого файла было прочитано не было.
150 Disk is write-protected (Диск защищён от записи)
(Критическая ошибка)
151 Bad drive request struct length (Неправильная длина структуры запроса)
(Критическая ошибка)
152 Drive not ready (Устройство не готово)
(Критическая ошибка)
154 CRC error in data (Ошибка контрольной суммы в данных)
(Критическая ошибка)
156 Disk seek error (Ошибка низкоуровнего поиска на диске)
(Критическая ошибка)
157 Unknown media type (Неизвестный тип …)
(Критическая ошибка)
158 Sector Not Found (Сектор не найден)
(Критическая ошибка)
159 Printer out of paper (Нет бумаги в принтере)
(Критическая ошибка)
160 Device write fault (Сбой записи устройства)
(Критическая ошибка)
161 Device read fault (Сбой чтения устройства)
(Критическая ошибка)
162 Hardware failure (Сбой железа)
(Критическая ошибка)
200 Division by zero (Деление на ноль)
Приложение пыталось разделить число на ноль.
201 Range check error (Ошибка проверки границ)
Если вы компилировали прогамму с включённой провереой границ, Вы можете получить эту ошибку в следующих случаях:
-
Массив был вызван с индексом, выходящим за декларированые пределы.
-
Попытка присвоить значение переменной, выходящее за декларированые границы (для instance и enumerated типов).
202 Stack overflow error (Переполнение стека)
Стек превысил свой максимально допустимый размер (в этом случае необходимо уменьшить размер локальных переменных), или стек был повреждён. Эта ошибка генерируется только с включённой проверкой стека.
203 Heap overflow error (Переполнение кучи)
Размер кучи превысил максимально возможный размер. Генерируется при попытке выделить память непосредственно функциями New, GetMem и ReallocMem, или когда экземпляр класса или объекта создаётся и памяти не достаточно. Пожалуйста учтите что, по умолчанию, Free Pascal поддерживает увеличение кучи, то есть, если необходимо, будет произведена попытка её увеличения. Как бы то ни было, если размер кучи превысил максимально допустимый системой и
железом, то Вы получите эту ошибку.
204 Invalid pointer operation (Непрваильная операция с указателем)
Будет сгенерирована при вызове функций Dispose или Freemem с неправильным указателем (чаще всего, Nil)
205 Floating point overflow (Максимальная границы числа с плавающей точкой)
Вы попытались использовать или создать слишком большое число с плавающей точкой.
206 Floating point underflow (Минимальная граница числа с плавающей точкой)
Вы попытались использовать или создать слишком маленькое число с плавающей точкой.
207 Invalid floating point operation (Неправильная операция над числами с плавающей точкой)
Может генерироваться если вы попытались получить квадратный корень или логарифм отрицательного числа.
210 Object not initialized (Объект не инициализирован)
Если программа была скомпилирована с включенной проверкой границ, эта ошибка будет сгенерирована при попытке вызвать виртуальный метод до его конструктора.
211 Call to abstract method (Попытка вызова абстрактного метода)
Ваша программа попыталась вызвать абстрактный виртуальный метод. Абстрактные методы должны быть перекрыты, и только перекрытый метод должен быть вызван.
212 Stream registration error (Ошибка регистрации потока)
Генерируется когда неправильный тип регистрируется в модуле objects.
213 Collection index out of range (Индекс элемента коллекции выходит за допустимые границы)
Генерируется когда Вы попытались обратиться к элементу коллекции с выходящим за допустимые границы индексом (модуль objects).
214 Collection overflow error (Переполнение коллекции)
Размер коллекции превысил максимально допустимый размер, а Вы попытались добавить новый элемент (модуль objects).
215 Arithmetic overflow error (Арифметическое переполнение)
Эта ошибка генерируется когда результат операции превысил допустимые границы. В отличие to Turbo Pascal, эта ошибка генерируется только для 32-bit и 64-bit арифметических переполнений. Это происходит согласно тому, что все операнды конвертируются в 32-bit или 64-bit, до того как производить вычисления.
216 General Protection fault (GP Ошибка защиты памяти)
Приложение попыталось обратиться к недопустимому участку памяти. Это может быть вызвано следующими причинами:
-
Попытка получить разуказатель для nil.
-
Попытка получить доступ к выходящему за допустимые границы участку памяти (например, вызов move с неправильной длиной).
217 Unhandled exception occurred (Произошо неизвестное исключение)
Произошло исключение, и для него не существеет хэндла. Модуль sysutils устанавливает handler(менеджер), который отлавливает все исключения, и безопасно выходит в случае обнаружения оного.
219 Invalid typecast (Неправильное приведение типов)
Генерируется когда недопустимое приведение типов производится над классом используя оператор as. Эта ошибка также генерируется, когда объект или класс приводится к недопустимому объекту или классу, и виртуальный метод этого объекта или класса вызывается. Эта последняя ошибка детектируется только с использованием опции -CR компилятора.
227 Assertion failed error (Сбой утверждения)
Утверждение провалено, и процедурная переменная AssertErrorProc не была уcтановлена.