idhttp.post方法后内存问题

linghengmao 2020-10-09 04:21:00
请教个问题:
调试时发现我每执行一次IDHTTP.post 方法,就会有一个叫TidSSLCipher没有释放内存,这该如何处理呀?
...全文
230 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
linghengmao 2020-11-27
  • 打赏
  • 举报
回复
还有人知道吗?
BlueStorm 2020-11-27
  • 打赏
  • 举报
回复
解决方法1:升级indy版本。Delphi中的indy可以更新到较新的indy版本,毕竟indy是第三方组件,最新版本都是支持D7的。 解决方法2:自己修复这个Bug。跟踪看一下TidSSLCipher是什么时候创建的,有没有释放。 解决方法3:升级delphi版本。不少人一直认为D7“经典”,我觉得那纯属放屁。Windows98, Dos6.22也很经典,怎么不见他们用?
tanqth 2020-11-27
  • 打赏
  • 举报
回复
引用 8 楼 linghengmao 的回复:
还有人知道吗?
还没搞定啊,不行就换高版本开发嘛,我之前专门给你测试了,现在的版本没你出现这情况。 不想换版本开发还有一条路,就是单独用高版本封装POST功能为DLL,然后你现在的系统去调用。
linghengmao 2020-10-10
  • 打赏
  • 举报
回复
释放了的,但好像释放得不干净,不知从哪里冒出 TidSSLCipher 这个没有被释放
tanqth 2020-10-10
  • 打赏
  • 举报
回复
你那应该就是没有释放掉。或者说是在释放时出了问题。
linghengmao 2020-10-10
  • 打赏
  • 举报
回复
我的版本是D7, 没有您所说的组件,现在的问题是代码可以执行,就是会有一点点内存泄漏,执行多了,原来程序只有几兆,一天下来就有100多兆了
tanqth 2020-10-09
  • 打赏
  • 举报
回复
你的代码看上去是没什么问题的。测试了一下,没问题,可能是我们版本不同,我使用的是TIdSSLIOHandlerSocketOpenSSL,没有TIdSSLIOHandlerSocket。

Function HttpPost(MsgSend: String; vUrl: String): String;
var
  vHttp: TIdHTTP;
  vIdSSL: TIdSSLIOHandlerSocketOpenSSL;
  mStream: TStringStream;
  FUrl: string;
begin
  Result := '';
  FUrl:= vUrl;
    vHttp := TIdHTTP.Create(nil);
    try
      vHttp.Request.ContentType := 'application/x-www-form-urlencoded';
      mStream := TStringStream.Create(MsgSend,CP_UTF8);

      //使用https安全通讯方式
      vIdSSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
      vHttp.IOHandler := vIdSSL;

      //Post 数据
      Result := vHttp.Post(FUrl,mStream);

    finally
      vHttp.IOHandler := nil;
      //vHttp.Disconnect;
      //vIdSSL.Destroy;
      FreeAndNil(vIdSSL);
      FreeAndNil(vHttp);
      FreeAndNil(mStream);
    end;

end;

procedure TForm8.Button1Click(Sender: TObject);
begin
  HttpPost('test','https://open.youzanyun.com/api/youzan.trade.get/4.0.0');
end;
你可以试试换成TNetHTTPClient去POST。
linghengmao 2020-10-09
  • 打赏
  • 举报
回复
httpGet创建如下: HttpGet:= TIdHTTP.Create(nil); HttpGet.HTTPOptions:= []; HttpGet.AllowCookies:= False; IdSSLIOHandlerSocket1:= TIdSSLIOHandlerSocket.Create(nil); IdSSLIOHandlerSocket1.SSLOptions.Method:= sslvSSLv23; HttpGet.IOHandler:= IdSSLIOHandlerSocket1; 释放如下: HttpGet.IOHandler:= nil; FreeAndNil(IdSSLIOHandlerSocket1); FreeAndNil(HttpGet); inherited;
linghengmao 2020-10-09
  • 打赏
  • 举报
回复
代码如下,就是调用了有赞商城的接口 var resultStr: string; sToken: string; begin sToken:= frmdm.GetAccessTokenByYun; if Trim(sToken) = '' then Exit; HttpGet.Request.ContentType:= 'application/x-www-form-urlencoded' ; Liststr.Clear; ListStr.Values['tid'] := tid; resultStr := DecodeUtf8Str(HttpGet.Post('https://open.youzanyun.com/api/youzan.trade.get/4.0.0'+ sToken, Liststr)); Result:= resultStr; end;
tanqth 2020-10-09
  • 打赏
  • 举报
回复
给出你使用的代码。正常情况下没这样的情况发生。

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧