Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.191.216.163] |
|
Сообщ.
#1
,
|
|||||||||||||||
|
Ошибка "Access Violation" возникает, когда идёт обращение к памяти к которой обращение запрещено. Это возможно во многих случаях, но в 99% случаев Access Violation говорит об обращении к объекту которого нет. Наиболее типичные ситуации я попытають перечислить: 1) Обращение к не созданному объекту.Объявлена переменная типа какой-нибудь объект, компонент, а обращение к ее свойствам и методам происходит до ее создания
В данном случае объект e ещё не создан и идёт обращение к памяти, которая ещё не выделена. 2) Обращение к уже разрушенному объекту:
Тут есть хитрость, допустим вы хотите проверить есть ли объект и модернизируете код:
или
Особенно часто приходится такое делать когда надо уничтожить объект:
Так вот - такой код может быть источником ошибки, так как метод Free автоматически не устанавливает указатель в Nil. Обязательно после каждого Free используйте установление указателя в nil:
3) При выходе за границы динамического массива обычно генерится ошибка "Index out of bound", но возможно и возникновение Access Violation, особенно когда не стоят опции компилляции по проверки границ массивов. Эта ошибка может быть очень сложна в отлаживании - дело в том что допустим у вас есть массив а длиной в 10 элементов, в пишете:
И эта строка может пройти как и надо, без всяких проблем, но её выполнение повредит какой-то другой код, причём каждый раз другой! Теперь самая безобидная операция типа i:=10 может вдруг внезапно дать Access Violation. 4) На главной форме на onCreate вызывается что-то с других форм - эти другие формы на этот момент еще не созданы 5) На главной форме на onDestroy вызывается что-то с других форм - эти другие формы на этот момент уже разрушены |