这跟
this question相似。我问“为什么?”到
the most popular response,但我不知道有人会再次看着它。至少不及时的。
无论如何,我的问题是关于将对象创建到函数或过程的责任的最佳做法,而不会导致内存泄漏。好像这样:
procedure FillObject(MyObject: TMyObject; SomeParam: Integer); begin //Database operations to fill object end; procedure CallUsingProcedure(); var MyObject: TMyObject; begin MyObject = TMyObject.Create(); try FillObject(MyObject,1); //use object finally MyObject.Free(); end; end;
优于此:
function CreateMyObject(DBID: Integer): TMyObject; begin Result := TMyObject.Create(); try //Database operations to fill object except on E: Exception do begin Result.Free(); raise; end; end; end; procedure CallUsingFunction(); var MyObject: TMyObject; begin MyObject = CreateMyObject(1); try //use object finally MyObject.Free(); end; end;
为什么?
我对Delphi来说比较新,以前在Java和PHP以及C中工作最多,但是在较小程度上。直观地,我倾向于功能方法,因为:
>它将对象创建代码封装在函数中,而不是每当我想使用该过程时分别创建对象。
我不喜欢改变参数的方法。它通常没有记录,可以使跟踪错误更加困难。
>暧昧,但诚然,这只是“闻起来”对我不好。
我不是说我是对的我只是想了解社区为什么选择这种方法,如果有更好的理由让我改变。
解决方法
创建对象实例并将其传递到另一个过程中可以清除哪个代码负责释放实例。
在第一种情况下(使用程序填写):
MyObj := TMyObject.Create; try // Do whatever with MyObj finally MyObj.Free; end;
这很清楚,该代码块在完成使用后负责释放MyObj。
MyObj := CreateMyObject(DBID);
应该释放什么代码?什么时候可以安全释放它?谁负责异常处理?你如何知道(作为别人的代码的用户)?
作为一般规则,您应该创建,使用和释放需要它们的对象实例。这使得您的代码更容易维护,并且肯定会使以后的人更容易,并且必须尝试弄清楚。