Почему возникает ошибка Access Violation?

Previous  Top  Next

    
 

 

Ошибка "Access Violation" возникает, когда идёт обращение к памяти к которой обращение запрещено. Это возможно во многих случаях, но наиболее типичные ситуации я попытаюсь перечислить:

 

1) Обращение к не созданному объекту.

 

Code:

var e:TEdit;

 

begin

e.text:='Hello world!';

end;

 

В данном случае объект e ещё не создан и идёт обращение к памяти, которая ещё не выделена.

 

 

2) Обращение к уже разрушенному объекту:

 

Code:

var e:TEdit;

begin

...

e.free;

...

e.text:='Hello world';

end;

 

 

Тут есть хитрость, допустим вы хотите проверить есть ли объект и модернизируете код:

 

Code:

if e<>nil then e.text:='Hello world!';

 

или

 

Code:

if assigned(e) then e.text:='Hello world!';

 

 

Особенно часто приходится такое делать когда надо уничтожить объект:

 

Code:

if e<>nil then e.free;

 

 

Так вот - такой код может быть источником ошибки, так как метод Free автоматически не устанавливает указатель в Nil. Обязательно после каждого Free используйте установление указателя в nil:

 

Code:

e.free;

e:=nil;

 

 

3) При выходе за границы динамического массива обычно генерится ошибка "Index out of bound", но возможно и возникновение Access Violation, особенно когда не стоят опции компилляции для проверки границ массивов. Эта ошибка может быть очень сложна в отлаживании - дело в том что допустим у вас есть массив а длиной в 10 элементов, в пишете:

 

Code:

a[20]:=something;

 

 

И эта строка может пройти как и надо, без всяких проблем, но её выполнение повредит какой-то другой код, причём каждый раз другой! Теперь самая безобидная операция типа i:=10 может вдруг внезапно дать Access Violation.

 

3) На форме на onCreate вызывается что-то с других форм - эти другие формы на этот момент еще не созданы

 

4) На форме на onDestroy вызывается что-то с других форм - эти другие формы на этот момент уже разрушены

 

 

©Drkb::00020

Автор: Vit (www.delphist.com, www.drkb.ru, www.unihighlighter.com, www.nevzorov.org)

Взято с Vingrad.ru http://forum.vingrad.ru