Delphi - 使用字符串时,一个注意地方
技术交流,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.
浙公网安备 33010602011771号