DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: xieqiongxi1
今日帖子: 0
在线用户: 1
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2017/3/4 17:35:54
标题:
Tencoding到底要不要释放? 浏览:1600
加入我的收藏
楼主: 环境是XE6,这是DELPHI帮助里的例子代码。
procedure TForm1.Button1Click(Sender: TObject);
var
  LBuffer: TBytes;
  LByteOrderMark: TBytes;
  LOffset: Integer;
  LEncoding, DestEncoding: TEncoding;
  LFileStream: TFileStream;
  EncodingArray: array[0..5] of TEncoding;
begin
  LEncoding:= nil;
  EncodingArray[0]:= TEncoding.UTF8;
  EncodingArray[1]:= TEncoding.UTF7;
  EncodingArray[2]:= TEncoding.Unicode;
  EncodingArray[3]:= TEncoding.Default;
  EncodingArray[4]:= TEncoding.BigEndianUnicode;
  EncodingArray[5]:= TEncoding.ASCII;
  DestEncoding := EncodingArray[ComboBox1.ItemIndex];
  LFileStream := TFileStream.Create(Edit1.Text, fmOpenRead);
  try
    // Read file into buffer.
    SetLength(LBuffer, LFileStream.Size);
//    LFileStream.Read(LBuffer[0], Length(LBuffer));
    LFileStream.ReadBuffer(Pointer(LBuffer)^, Length(LBuffer));
 
    // Identify encoding and convert buffer to UTF8.
    LOffset := TEncoding.GetBufferEncoding(LBuffer, LEncoding);
//    for I := 0 to Length(LBuffer) - 1 do
//      Memo1.Lines.Add((LBuffer[I]));
    LBuffer := LEncoding.Convert(LEncoding, DestEncoding, LBuffer,
      LOffset, Length(LBuffer) - LOffset);
  finally
    LFileStream.Free;
  end;
 
  LFileStream := TFileStream.Create(Edit2.Text, fmCreate);
  try
    // Write an encoding byte-order mark and buffer to output file.
    LByteOrderMark := DestEncoding.GetPreamble;
    LFileStream.Write(LByteOrderMark[0], Length(LByteOrderMark));
    LFileStream.Write(LBuffer[0], Length(LBuffer));
  finally
    LFileStream.Free;
  end;
end;

这里的LEncoding没有free,用 FASTMM等工具会检测到内存泄漏。
如果LEncoding.free,,下一次使用tencoding时有可能会出现莫名其妙的问题,如附图,其中的FMaxCharSize值明显不正常。
此帖子包含附件:
PNG 图像
大小:30.6K
----------------------------------------------
-
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2017/3/4 21:03:00
1楼: FastMM误报
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 sail2000 (小帆工作室) ★☆☆☆☆ -
盒子活跃会员
2017/3/4 22:01:33
2楼: 都xe6了,干嘛不用 ReportMemoryLeaksOnShutdown := True;
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
男 lordaeron (Terry) ★☆☆☆☆ -
禁用账号
2017/3/5 7:56:31
3楼: ……
被禁用帐号,帖子内容自动屏蔽!
……

----------------------------------------------
该账号是个傻逼
作者:
男 hardnut (麦轲数据管家) ★☆☆☆☆ -
普通会员
2017/3/5 11:16:14
4楼: 上代码:delphi berlin update 2: 

 TEncoding = class
  strict private
    class var
      FANSIEncoding: TEncoding;
      FASCIIEncoding: TEncoding;
      FBigEndianUnicodeEncoding: TEncoding;
      FUnicodeEncoding: TEncoding;
      FUTF7Encoding: TEncoding;
      FUTF8Encoding: TEncoding;
    class destructor Destroy;
    class function GetANSI: TEncoding; static;
    class function GetASCII: TEncoding; static;
    class function GetBigEndianUnicode: TEncoding; static;
    class function GetDefault: TEncoding; static; inline;
    class function GetUnicode: TEncoding; static;
    class function GetUTF7: TEncoding; static;
    class function GetUTF8: TEncoding; static;

从代码可知:
1.这些Encoding实例都是在需要时才创建的
2.创建之后就保存在类变量中,返回一个指针给调用者,因此调用者绝对不要释放它
3.这些变量在程序退出时会在单元finalize中被释放
----------------------------------------------
UniKeeper V10.40 -- 您最贴心的个人数据管理助手
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/3/5 15:41:57
5楼: 顶 2 4 楼。
----------------------------------------------
(C)(P)Flying Wang
作者:
男 badwood (badwood) ★☆☆☆☆ -
盒子活跃会员
2017/3/5 19:14:00
6楼: 用XE6内置 ReportMemoryLeaksOnShutdown 或下载的FASTMM完整版、 eurekalog ,如果不free会内存泄漏。

比如下面的代码
Result := Tencoding.GetEncoding(codepage).getstring(abytes);


var
ATencoding:Tencoding;
begin
ATencoding := Tencoding.GetEncoding(codepage);
Result := ATencoding.getstring(abytes);
end;
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2017/3/5 20:47:36
7楼: 难道是 XE6 的 BUG ?
可惜啊,只用过 XE6 几天,就换别的新版本了。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行80.07813毫秒 RSS