Витік пам'яті в tobjectlist - stack overflow російською

Ще раз: не додавайте "Вирішено!" в заголовок питання, це не відноситься до питання взагалі. Решённость питання визначається наявністю галочки у одного з його відповідей. Якщо не можете поставити галочку зараз самі (термін давності не дозволяє), не потрібно відзначати іншими способами. Можуть і інші відповіді вчинити. - D-side 27 Березня о 11:47

Що стосується виключення - точне місце створення об'єкта, який не знищився може показати FastMM або EurekaLog. Наведений код робочий і в більшості випадків все правильно звільняється. (Нюанси описав нижче.) Швидше за все ви створюється TreeList і його не знищуєте (або чекаєте що його знищить батьківський об'єкт, а він не призначений).

Може я що щось упустив, але я не бачу звідки беруться дані для заповнення SecParams.

Якщо ви до моменту додавання створили SecParams - його потрібно знищити. Інакше буде витік.

Друга ділянка try..except. При виникненні виключення - об'єкт все-таки не знищиться.

Хоча теж не ясно, ну не обробились параметри, значить вони в неправильному форматі - об'єкт створиться, але з порожнім параметром ParamsLst. І якщо до нього звернеться без перевірки - буде Access Violation.

TObjData - є загальні правила коли з літери T починаються опису типів. F - для внутрішніх полів класу.

Для полів класу TMyObj потрібно явно вказати ідентифікатор видимості (private, public), а ще краще перенести їх в секцію private і дати доступ до полів за допомогою властивостей. наприклад:

  • TMyObj - назва класу має описувати об'єкт. (Наприклад: TPerson)
  • @androshuk, ще раз спасибі! Спасибі всім за пропозиції, все врахував. З урахуванням Ваших пропозицій (зміна стилю коду), проблему вирішив звільненням ParamsLst: TStringList до звільнення TDataList (привласнення по старому коду). property ParamsLst: TStringList read FParamsLst ;. for i: = 0 to TObjData.Count - 1 do begin with TObjData.Items [i] do begin TObjData.Items [i] .ParamsLst.Free; end; end; // При видаленні списку залишилися в ньому об'єкти будуть вилучені. TObjData.Free ;. - Deda 26 Березня о 21:58

    У коді немає жодного моменту заповнення змінної з дивним ім'ям TObjData. Але можу припустити, що OwnsObjects неправильно спрацьовує.

    У фіналізації перед руйнуванням об'єкту TObjData краще зробити цикл перевірки вкладених в нього об'єктів та з'ясування з якої причини вони не звільняються до фіналізації.

    Схожі статті