当标头中没有返回字符集时,REST请求内存泄漏
使用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运行应用程序会返回:
更新:将FallbackCharsetEncoding设置为空字符串似乎“修复”内存泄漏.没有已知的问题(尚未)这样做.我打算用Embarcadero打开一个bug报告来看看他们说的话.因此,在执行请求之前添加以下行将防止意外的内存泄漏消息. RESTClient1.FallbackCharsetEncoding := ''; 更新2:错误报告RSP-17695于2017年3月30日提交. 更新3:2017年8月8日:在10.2版东京第1版中解决了Bug 解决方法
为了避免内存泄漏,有一种可能的解决方法:
RestClient.FallbackCharsetEncoding := ''; 通过将回退编码设置为空或“原始”字符串,将不会执行REST库中代码的“泄漏”分支,因此您不会泄漏未发布的TEncoding实例(使用GetEncoding()获取). 但是,如果您使用原始编码回退,那么这当然只是吵闹. 这适用于柏林更新2.在东京更新1中的补丁之前,可能也适用于更高版本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |