使用Delphi 10.2(东京)
以下是完整控制台应用程序的代码,该应用程序在调用一个URL时显示意外的内存泄漏(TUTF8Encoding),并且在调用另一个URL时没有内存泄漏。
比较两个回复之间的标题:
泄漏内存的那个包含
Content-Type=application/json
不泄漏内存包含
Content-Type=application/json; charset=utf-8
这是一个错误,还是我应该做些什么来防止这种情况?
program RESTMemLeakTest;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, IPPeerClient, REST.Client, REST.Types;
var
RESTClient1: TRESTClient;
RESTRequest1: TRESTRequest;
URL: string;
begin
ReportMemoryLeaksOnShutdown := True;
URL := 'https://httpbin.org/post'; // memory leak
//URL := 'https://jsonplaceholder.typicode.com/posts'; // no memory leak
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.
使用泄漏内存的URL运行应用程序会返回:
发生了意外的内存泄漏。意想不到的小块 泄漏是:
21 - 28字节:TUTF8Encoding x 1
更新:将FallbackCharsetEncoding设置为空字符串似乎是“修复”内存泄漏。没有已知的问题(尚未)这样做。我打算用Embarcadero打开一个bug报告来看看他们说的话。因此,在执行请求之前添加以下行将防止意外的内存泄漏消息。
RESTClient1.FallbackCharsetEncoding := '';
更新2 :错误报告RSP-17695已于2017年3月30日提交。
更新3 :2017年8月8日:在10.2版东京第1版中解决了错误
答案 0 :(得分:2)
为了避免内存泄漏,有一种可能的解决方法:
RestClient.FallbackCharsetEncoding := '';
通过将回退编码设置为空或“原始”字符串,将不会执行REST库中代码的“泄漏”分支,因此您不会得到未发布的TEncoding实例的泄漏(这是获取的GetEncoding())。
但是,如果您使用原始编码回退,那么这当然只是吵闹。
这适用于柏林更新2.在东京更新1中的补丁之前,可能也适用于更高版本。