Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
标头中未返回字符集时REST请求内存泄漏_Rest_Delphi_Memory Leaks - Fatal编程技术网

标头中未返回字符集时REST请求内存泄漏

标头中未返回字符集时REST请求内存泄漏,rest,delphi,memory-leaks,Rest,Delphi,Memory Leaks,使用Delphi10.2(东京) 下面是一个完整控制台应用程序的代码,该应用程序在调用一个URL时显示意外内存泄漏(TUTF8Encoding),在调用另一个URL时显示没有内存泄漏 比较两个响应之间的标题: 泄漏内存的那个包含 Content-Type=application/json Content-Type=application/json; charset=utf-8 不泄漏内存的包含 Content-Type=application/json Content-Type=a

使用Delphi10.2(东京)

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

比较两个响应之间的标题:

泄漏内存的那个包含

 Content-Type=application/json
 Content-Type=application/json; charset=utf-8
不泄漏内存的包含

 Content-Type=application/json
 Content-Type=application/json; charset=utf-8
这是一个bug,还是我应该做些什么来防止它

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字节:TUTF8x1

更新:将FallbackCharsetEncoding设置为空字符串似乎可以“修复”内存泄漏。没有已知的问题(尚未)这样做。我将和Embarcadero一起打开一个bug报告,看看他们怎么说。因此,在执行请求之前添加下面的行可以防止意外的内存泄漏消息

RESTClient1.FallbackCharsetEncoding := '';
更新2:缺陷报告于2017年3月30日提交


更新3:2017年8月8日:10.2版东京版本1中的错误已解决

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

RestClient.FallbackCharsetEncoding := '';
通过将回退编码设置为空或“原始”字符串,将不会执行REST库中代码的“泄漏”分支,因此您不会得到未发布的TEncoding实例(通过GetEncoding()获得)的泄漏

但这当然只有在您同意使用原始编码回退的情况下才可以使用WOKR


这在柏林更新2中有效。可能也可以在东京更新1补丁之前的更高版本中使用。

这表明1)REST客户端正在调用
TEncoding.GetEncoding(65001)
TEncoding.GetEncoding('utf-8')
而不是使用
TEncoding.UTF8
,并且没有释放返回的
TEncoding
(由
GetEncoding()
返回的
TEncoding
必须手动释放);2)REST客户端正在使用
TEncoding.UTF8
并且在进程终止期间释放支持
TEncoding.UTF8
的全局
TUTF8Encoding
对象之前刚刚生成泄漏报告。在没有看到泄漏内存分配的调用堆栈或查看其余源代码的情况下,很难说是这样还是那样