Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Ошибка при очистке списка во время закрытия проекта  (Прочитано 4071 раз)

yukiaire

  • Новичок
  • *
  • Сообщений: 10
    • Просмотр профиля
Добрый день! У меня есть глобальный модуль, в котором объявлен список и массив, согласно руководству необходимо очищать данные во время закрытия проекта  во избежание утечки памяти. Заметила, что судя по логам возникает ошибка:
Код
11:36:43.096 | Ошибка в скрипте "alarms_list" в строке 90. Access violation at address 0040A574 in module 'Server.exe'. Read of address FFFFFFFC
11:36:43.096 | Необработанная ошибка в скрипте "alarms_list" в строке 91. Access violation at address 0040A574 in module 'Server.exe'. Read of address FFFFFFFC
что неверно?

код скрипта alarms_list:
Код: (delphi)
interface

var
  aList: TM_List;          // объявляем список для сигналов об авариях
  mArray: Array of Boolean; // создаем массив для хранения информации о том, отправились ли сообщения об авариях

implementation

initialization
               // во время запуска проекта
  aList := TM_List.Create; // создаём список
  aList.Add(alarm_1); // заполняем список сигналами об авариях (при создании нового сигнала об аварии добавить его сюда)
  aList.Add(alarm_2);
  aList.Add(alarm_3);
  aList.Add(alarm_4);
  aList.Add(alarm_5);
  aList.Add(alarm_6);
  aList.Add(alarm_7);
  aList.Add(alarm_8);
  aList.Add(alarm_9);
  aList.Add(alarm_10);
  aList.Add(alarm_11);
  aList.Add(alarm_12);
  aList.Add(alarm_13);
  aList.Add(alarm_14);
  aList.Add(alarm_15);
  aList.Add(alarm_16);
  aList.Add(alarm_17);
  aList.Add(alarm_18);
  aList.Add(alarm_19);
  aList.Add(alarm_20);
  aList.Add(alarm_21);
  aList.Add(alarm_22);
  aList.Add(alarm_23);
  aList.Add(alarm_24);
  aList.Add(alarm_25);
  aList.Add(alarm_26);
  aList.Add(alarm_27);
  aList.Add(alarm_28);
  aList.Add(alarm_29);
  aList.Add(alarm_30);
  aList.Add(alarm_31);
  aList.Add(alarm_32);
  aList.Add(alarm_33);
  aList.Add(alarm_34);
  aList.Add(alarm_35);
  aList.Add(alarm_36);
  aList.Add(alarm_37);
  aList.Add(alarm_38);
  aList.Add(alarm_39);
  aList.Add(alarm_40);
  aList.Add(alarm_41);
  aList.Add(alarm_42);
  aList.Add(alarm_43);
  aList.Add(alarm_44);
  aList.Add(alarm_45);
  aList.Add(alarm_46);
  aList.Add(alarm_47);
  aList.Add(alarm_48);
  aList.Add(alarm_49);
  aList.Add(alarm_50);
  aList.Add(alarm_51);
  aList.Add(alarm_52);
  aList.Add(alarm_53);
  aList.Add(alarm_54);
  aList.Add(alarm_55);
  aList.Add(alarm_56);
  aList.Add(alarm_57);
  aList.Add(alarm_58);
  aList.Add(alarm_59);
  aList.Add(alarm_60);
  aList.Add(alarm_61);
  aList.Add(alarm_62);
  aList.Add(alarm_63);
  aList.Add(alarm_64);
  aList.Add(alarm_65);
  aList.Add(alarm_67);
  aList.Add(alarm_68);
  aList.Add(alarm_69);
  aList.Add(alarm_70);
  aList.Add(alarm_74);
  aList.Add(alarm_75);
  aList.Add(alarm_76);
  aList.Add(alarm_77);
  aList.Add(alarm_78);
  SetLength(mArray, aList.Count);

finalization // во время выключения проекта
  FreeAndNil(aList);  // !!! обязательно удаляем список (89 строка)
  FreeAndNil(mArray); // (90 строка)
end.
« Изменён: 17 Января 2023, 22:07:26 от Simple-Scada »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3214
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

Очищать нужно только объекты (экземпляры классов, созданные вызовом .Create). Обычные числовые/строковые переменные и переменные-массивы вручную очищать не нужно. Т.е. код финализации в Вашем случае можно изменить так:
Код: (delphi)
finalization
  FreeAndNil(aList);    // удаляем список
  SetLength(mArray, 0); // устанавливаем длину массива в 0 освобождая память (не обязательно это делать, но так память освободится быстрее)

Если элементы списка (alarm_1, alarm_2 и т.д.) это объекты, которые Вы содаёте в других скриптах, то их нужно обязательно удалить перед удалением списка.
Если возникнут сложности, то вышлите текущую версию проекта на support@simple-scada.com, мы проверим код и опишем правильный вариант.