Разработчики, работающие с технологиями на основе Delphi, иногда сталкиваются с неожиданными проблемами, такими как утечки памяти. В данной статье мы рассмотрим одну из таких проблем, связанную с использованием REST-запросов в Delphi 10.2 и способ её решения.
Описание проблемы
При выполнении REST-запросов в приложении на Delphi 10.2 был обнаружен неожиданный сбой в управлении памятью, который проявлялся в виде утечки памяти при работе с определенными URL. Это происходит только тогда, когда в заголовке ответа отсутствует указание на кодировку символов. В частности, запрос к URL, который возвращает заголовок Content-Type=application/json, приводит к утечке памяти, в то время как запрос с указанием кодировки Content-Type=application/json; charset=utf-8 памяти не теряет.
Пример кода, вызывающего утечку памяти
program RESTMemLeakTest;
{$APPTYPE CONSOLE}
uses
System.SysUtils, IPPeerClient, REST.Client, REST.Types;
var
RESTClient1: TRESTClient;
RESTRequest1: TRESTRequest;
URL: string;
begin
ReportMemoryLeaksOnShutdown := True;
URL := 'https://httpbin.org/post'; // URL, вызывающий утечку памяти
//URL := 'https://jsonplaceholder.typicode.com/posts'; // URL без утечки памяти
RESTClient1 := TRESTClient.Create(URL);
RESTRequest1 := TRESTRequest.Create(nil);
try
try
RESTRequest1.Client := RESTClient1;
RESTRequest1.Method := rmPOST;
RESTRequest1.Execute;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
finally
RESTRequest1.Free;
RESTClient1.Free;
end;
end.
Возможное решение проблемы
Изменение свойства FallbackCharsetEncoding объекта TRESTClient на пустую строку позволяет избежать утечки памяти. Это свойство используется для указания кодировки символов, которая будет применяться в случае, если в заголовке ответа такая информация отсутствует. Установка свойства в пустую строку предотвращает выполнение кода, который может привести к утечке памяти.
RESTClient1.FallbackCharsetEncoding := '';
Обновления и комментарии
После обнаружения проблемы был создан отчет о баге (RSP-17695), который был решен в версии 10.2 Tokyo Release 1, выпущенной 8 августа 2017 года.
Альтернативные соображения
Существуют предположения, что проблема может быть связана с неправильным освобождением ресурсов, связанных с объектом TEncoding. Однако без дополнительной информации, такой как стек вызовов утечки памяти, точно определить причину проблемы сложно.
Заключение
Разработчикам, столкнувшимся с аналогичной проблемой, рекомендуется установить свойство FallbackCharsetEncoding в пустую строку для предотвращения утечки памяти. Это решение может быть применимо и в более ранних версиях, таких как Berlin Update 2, до выпуска исправления в Tokyo Update 1. Однако важно отметить, что использование пустой строки в качестве значения для кодировки может повлиять на обработку текста в приложении, поэтому перед применением этого решения следует тщательно его протестировать.
Разработчики Delphi 10.2 сталкиваются с утечкой памяти при выполнении REST-запросов из-за отсутствия указания кодировки в заголовке ответа, и решение заключается в настройке свойства `FallbackCharsetEncoding` объекта `TRESTClient`.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS