Delphi - 使用字符串时,一个注意地方
技术交流,DH讲解.
一句话,结构体里面,避免使用String,要使用Array[N..M] of char,或者String[N].
肯定有兄弟要问,为什么,其实最先我也不知道,因为我觉得用string也没有错的.
看例子:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 ; |
没有错误,难道我危言耸听了.....
其实这个时候因为结构体的内存管理是有编译器来管理,所以没有问题,但是如果我们是在列表中添加记录体指针呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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';
思前想后,我觉得还是改成:
1 2 3 4 5 | THuangJacky = record Age: Integer ; FName: string [ 23 ]; //凑4的倍数,那为什么要23个呢?请看字符串 详解 end ; PHuangJacky = ^THuangJacky; |
这样果然不会内存泄漏了.
后来和肥鸟兄讨论下,他提出一个不用改String的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步