На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: jack128, Rouse_, Krid
  
    > Почему возникает "Access Violation"? , Наиболее типичные ошибки.
      Ошибка "Access Violation" возникает, когда идёт обращение к памяти к которой обращение запрещено. Это возможно во многих случаях, но в 99% случаев Access Violation говорит об обращении к объекту которого нет.

      Наиболее типичные ситуации я попытають перечислить:

      1) Обращение к не созданному объекту.Объявлена переменная типа какой-нибудь объект, компонент, а обращение к ее свойствам и методам происходит до ее создания


      var e:TEdit;
      begin
      e.text:='Hello world!';
      end;


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



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

      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;


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

      a[20]:=smething;


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

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

      5) На главной форме на onDestroy вызывается что-то с других форм - эти другие формы на этот момент уже разрушены
      Сообщение отредактировано: Vit -
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script execution time: 0,0157 ]   [ 16 queries used ]   [ Generated: 28.04.24, 05:15 GMT ]