Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Ошибка `EInvalidPointer` при освобождении `TStringList` в Delphi: причины и решение проблемы

Delphi , Синтаксис , Память и Указатели

Оригинальный заголовок: Delphi XE3 Invalid Pointer when trying to free FSQL (TStringList)

Описание проблемы: Пользователь сталкивает с ошибкой при освобождении памяти для объекта TStringList, созданного в проекте, написанном на Delphi XE7, но компилируемом в XE3. Ошибка указывает на EInvalidPointer и возникает при попытке освободить память для переменной FSQL, которая была создана в конструкторе модуля данных. В коде, отвечающем за освобождение ресурсов, присутствуют подозрения на возможную утечку памяти, поскольку при отсутствии освобождения ресурса происходит утечка памяти, однако, если применить обработку исключений, ошибка успешно обходит стороной. В другом месте того же модуля используется аналогичный объект TStringList, который освобождается без ошибок.

Пример кода, вызывающего ошибку:

procedure TPayorDM.DataModuleDestroy(Sender: TObject);
begin
  try
    FSQL.Free;
  except
  end;
  if T_Payor.Active then
    T_Payor.Close;
  end;
  FreeAndNil(FPayorDRM);
end;

Альтернативный ответ: Пользователь уже упоминал, что проблема может быть связана с тем, что память была выделена другим менеджером, уже освобождена ранее или никогда не выделялась. Однако, в предоставленном коде нет явных признаков, указывающих на эти причины.

Подтвержденный ответ: Проблема заключается в том, что объект TStringList освобождается дважды. Это происходит из-за того, как реализован сеттер для свойства SQL, которое присваивает значение полю FSQL объекта TPayorDM. В коде сеттера используется присваивание, что приводит к потере ссылки на старый объект. Изменение сеттера на использование метода Assign вместо присваивания решит проблему:

procedure TPayorDM._psetSQL(const Value: TStringList);
begin
  FSQL.Assign(Value);
end;

Таким образом, когда свойство SQL изменяется, старый объект TStringList освобождается автоматически, и при вызове Free или FreeAndNil для поля FSQL в деструкторе модуля данных не происходит попытки освободить уже несуществующий объект.

Создано по материалам из источника по ссылке.

Пользователь столкнулся с ошибкой недопустивого указателя при попытке освободить память для объекта `TStringList` в проекте на Delphi XE7, компилируемом под версию XE3, из-за двойного освобождения объекта.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Память и Указатели ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-08-30 21:53:30/0.008145809173584/1