导航:
论坛 -> DELPHI技术
斑竹:liumazi,sephil
作者:
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值明显不正常。
此帖子包含附件: 大小: 30.6K
----------------------------------------------
-
作者:
2017/3/4 22:01:33
2楼:
都xe6了,干嘛不用 ReportMemoryLeaksOnShutdown := True;
----------------------------------------------
delphi 是兴趣,和工作无关,即使它倒闭。又不靠它 delphi 吃饭,怕甚?
作者:
2017/3/5 7:56:31
3楼:
…… 被禁用帐号,帖子内容自动屏蔽! ……
----------------------------------------------
该账号是个傻逼
作者:
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 -- 您最贴心的个人数据管理助手
作者:
2017/3/5 15:41:57
5楼:
顶 2 4 楼。
----------------------------------------------
(C)(P)Flying Wang
作者:
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;
----------------------------------------------
-
作者:
2017/3/5 20:47:36
7楼:
难道是 XE6 的 BUG ? 可惜啊,只用过 XE6 几天,就换别的新版本了。
----------------------------------------------
(C)(P)Flying Wang