Почему возникает ошибка Access Violation?
Материал из DRKB
Почему возникает ошибка Access Violation?[править | править код]
Ошибка "Access Violation" возникает, когда идёт обращение к памяти к которой обращение запрещено. Это возможно во многих случаях, но наиболее типичные ситуации я попытаюсь перечислить:
Обращение к не созданному объекту[править | править код]
var
e: TEdit;
begin
e.text := 'Hello world!';
end;
В данном случае объект e ещё не создан и идёт обращение к памяти, которая ещё не выделена.
Обращение к уже разрушенному объекту[править | править код]
var
e: TEdit;
begin
...
e.free();
...
e.text := 'Hello world';
end;
Тут есть хитрость, допустим вы хотите проверить есть ли объект и модернизируете код:
if e <> nil then
e.text := 'Hello world!';
или
if Assigned(e) then
e.text := 'Hello world!';
Особенно часто приходится такое делать когда надо уничтожить объект:
if e <> nil then
e.free();
Так вот - такой код может быть источником ошибки, так как метод Free автоматически не устанавливает указатель в Nil. Обязательно после каждого Free используйте установление указателя в nil:
e.free();
e := nil;
При выходе за границы динамического массива[править | править код]
При выходе за границы динамического массива обычно генерится ошибка "Index out of bound", но возможно и возникновение Access Violation, особенно когда не стоят опции компиляции для проверки границ массивов. Эта ошибка может быть очень сложна в отлаживании - дело в том что допустим у вас есть массив а длиной в 10 элементов, в пишете:
a[20] := something;
И эта строка может пройти как и надо, без всяких проблем, но её выполнение повредит какой-то другой код, причём каждый раз другой! Теперь самая безобидная операция типа i := 10 может вдруг внезапно дать Access Violation.
OnCreate и OnDestroy[править | править код]
- На форме на onCreate вызывается что-то с других форм - эти другие формы на этот момент еще не созданы
- На форме на onDestroy вызывается что-то с других форм - эти другие формы на этот момент уже разрушены
Author: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)
Source: http://forum.vingrad.ru
ID: 00020