gpt4 book ai didi

当 header 中没有返回字符集时,REST 请求内存泄漏

转载 作者:行者123 更新时间:2023-12-03 15:13:31 26 4
gpt4 key购买 nike

使用 Delphi 10.2(东京)

下面是一个完整的控制台应用程序的代码,该代码在调用一个 URL 时显示意外内存泄漏 (TUTF8Encoding),而在调用另一个 URL 时则没有内存泄漏。

比较两个响应之间的 header :

泄漏内存的内容包含

 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 运行应用程序会返回以下内容:

An unexpected memory leak has occurred. The unexpected small block leaks are:

21 - 28 bytes: TUTF8Encoding x 1

更新:将 FallbackCharsetEncoding 设置为空字符串似乎可以“修复”内存泄漏。执行此操作时尚无已知问题。我将向 Embarcadero 提交一份错误报告,看看他们怎么说。因此,在执行请求之前添加以下行将防止出现意外的内存泄漏消息。

RESTClient1.FallbackCharsetEncoding := '';

更新 2:错误报告 RSP-17695于2017年3月30日提交。

更新 3:2017 年 8 月 8 日:解决了版本 10.2 Tokyo Release 1 中的错误

最佳答案

为了避免内存泄漏,有一个可能的解决方法:

RestClient.FallbackCharsetEncoding := '';

通过将后备编码设置为空或“原始”字符串,REST 库中代码的“泄漏”分支将不会被执行,因此您不会泄漏未发布的 TEncoding 实例(通过GetEncoding())。

但是,这当然只有在您同意使用原始编码后备时才有效。

这适用于柏林更新 2。可能也适用于东京更新 1 补丁之前的更高版本。

关于当 header 中没有返回字符集时,REST 请求内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43098712/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com