关于对象参数传递的问题(50分)

  • 主题发起人 主题发起人 LJ868LJ
  • 开始时间 开始时间
L

LJ868LJ

Unregistered / Unconfirmed
GUEST, unregistred user!
我想用TIDFTP组件做一个FTP工具,发现这个组件的list方法在使用时有点奇怪,这个方法的定义如下:
procedure TIdFTP.List(ADest: TStrings
const ASpecifier: string = ''
const ADetails: boolean = true);
var
LDest: TStringStream;
begin
LDest := TStringStream.Create('');
try
if ADetails then begin
InternalGet(trim('LIST ' + ASpecifier), LDest)

end else begin
InternalGet(trim('NLST ' + ASpecifier), LDest)

end;
FreeAndNil(FDirectoryListing);
if Assigned(ADest) then begin //APR: User can use ListResult and DirectoryListing
ADest.Text := LDest.DataString;
end;
FListResult.Text := LDest.DataString;
finally FreeAndNil(LDest)

end;
end;
这个函数的作用是将FTP服务器的当前目录信息保存在一个TStings对象中,调用这函数时需要提供一个TStrings对象。
  问题就出在这里,提供给这个list函数的TStrings对象参数需不需要先对它进行初始化呢?
  观察list函数的定义发现list函数中会对用create方法对这个对象参数进行初始化,所以我认为提供给list函数的对象参数事先不用进行初始化,否则会造成内存泄露(刘艺的“面向对象编程思想”中有讲),所以我认为应该用如下方法:
......
  var
ls:tstringlist;
begin
.....
.....
ftpclient.List(ls);
.....
end;
但是在运行时出错

先对ls初始化就不不出错了
......
  var
ls:tstringlist;
begin
.....
ls:=tstringlist.create;//因为tstrings是虚类,不能创建实例,可以用它的子类来创建实例
ftpclient.List(ls);
.....
end;
 
必须先初始化, list:= tstringlist.create
如果它包含了objects列表,在释放时需要一一释放列表。就不会泄漏了。
 
//所以我认为提供给list函数的对象参数事先不用进行初始化,否则会造成内存泄露

我并不这样认为,任何对象都需要创建才能够保存信息。
TIdFTP.List(ADest: TStrings)使用是值传递,几乎不用说是一定要创建的对象才能用的。。

//观察list函数的定义发现list函数中会对用create方法对这个对象参数进行初始化

没有。
 
厚厚!刘艺如果真的按你上面的写法说“这样才不会内存泄漏”,那就是刘艺放屁,否则
就是你放屁!代码中写得明明白白这个是输入参数,你不负责初始化你让鬼给你初始化?

搞笑也不是这样搞的,弄得高级点先!
 
后退
顶部