• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Delphi-使用字符串时,一个注意地方

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

技术交流,DH讲解.

一句话,结构体里面,避免使用String,要使用Array[N..M] of char,或者String[N].
肯定有兄弟要问,为什么,其实最先我也不知道,因为我觉得用string也没有错的.
看例子:

  THuangJacky = record
    Age:Integer;
    FName:string;
  end;

procedure TForm3.btn1Click(Sender: TObject);
var
  A:THuangJacky;
begin
  A.FName:='HuangJacky';
  A.Age:=23;
  ShowMessage(A.FName);
end;

没有错误,难道我危言耸听了.....
其实这个时候因为结构体的内存管理是有编译器来管理,所以没有问题,但是如果我们是在列表中添加记录体指针呢?

  THuangJacky = record
    Age:Integer;
    FName:string;
  end;
  PHuangJacky = ^THuangJacky;

procedure TForm3.btn1Click(Sender: TObject);
var
  A:PHuangJacky;
  L:TList;
begin
  //先申请空间
  New(A);
  //结构体指针可以省略后面这个^
  A^.Age:=23;
  A.FName:='HuangJacky';
  L:=TList.Create;
  try
    L.Add(A);
    ShowMessage(PHuangJacky(L[0])^.FName);
  finally
    //清除使用的内存.
    FreeMem(L[0]);
    L.Clear;
    L.Free;
  end;
end;

运行没有问题啦,哈哈,可是在关闭程序的时候,如果开了内存泄漏或者用了其他工具就能报出有内存泄漏,
Memory Leak: Total size=34 - Count=1.泄漏位置A.FName:='HuangJacky';
思前想后,我觉得还是改成:

  THuangJacky = record
    Age:Integer;
    FName:string[23];//凑4的倍数,那为什么要23个呢?请看字符串 详解
  end;
  PHuangJacky = ^THuangJacky;

这样果然不会内存泄漏了.
后来和肥鸟兄讨论下,他提出一个不用改String的方法:

procedure TForm3.btn1Click(Sender: TObject);
var
  A:PHuangJacky;
  L:TList;
begin
  //先申请空间
  New(A);
  try
  //只要对内存进行了读写,最好用tryf来保证不泄露
  //结构体指针可以省略后面这个^
    A^.Age:=23;
    A.FName:='HuangJacky';
    L:=TList.Create;
    L.Add(A);
    ShowMessage(PHuangJacky(L[0])^.FName);
  finally
    //清除使用的内存.
    A:=PHuangJacky(L[0]);
    //new 和 dispose是配对使用的,GetMem和FreeMem配对使用
    //new() = GetMem() + Initialize()
    Dispose(A);
    L.Clear;
    L.Free;
  end;
end;


也不会内存泄漏了.肥鸟兄是用Delphi写服务器程序,所以对这些都了解得清楚些.不错.又学习了一把.

严谨.
明白了吧,我DH是不会忽悠人的.
Have Fun.


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
【原创】Matlab.NET混合编程技巧之直接调用Matlab内置函数发布时间:2022-07-18
下一篇:
多项式结式的的MATLAB实现发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap