这与此问题类似.我问"为什么?" 以最流行的反应,但我不知道任何人会永远看着它一次.至少不是及时的.
无论如何,我的问题是关于将对象创建的责任委托给函数或过程的最佳实践,而不会导致内存泄漏.看来这个:
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;
Run Code Online (Sandbox Code Playgroud)
比这更受欢迎:
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;
Run Code Online (Sandbox Code Playgroud)
为什么? …
请问,有人可以解释一下,在这段代码中会出现什么异常?
function CreateBibleNames: TStrings;
begin
Result := TStringList.Create;
try
Result.Add('Adam');
Result.Add('Eva');
Result.Add('Kain');
Result.Add('Abel');
except
Result.Free;
raise;
end;
end;
Run Code Online (Sandbox Code Playgroud)
因为我使用delphi,所以我曾经使用过一次异常处理.我认为上面的代码是由熟练的程序员编写的,我不认为异常是多余的.但是,在这个概念中使用异常处理对我来说仍然是一个谜.它似乎是一个安全的代码(没有尝试除了结束).我已经多次看到类似这样的代码片段,这就是为什么尽管有我的经验,这可能是一个很好的理由以这种方式编写,但这并不是必要的.
此外,当事情失败时,我会得到异常描述......
感谢名单
假设我有一个功能:
function someFunction: TStringList;
begin
result:=TStringList.Create;
if someConditionIsTrue then
result:=doSomething;
//other code
end;
Run Code Online (Sandbox Code Playgroud)
功能doSomething:
function doSomething: TStringList;
begin
result:=TStringList.Create;
result.Add(something);
end;
Run Code Online (Sandbox Code Playgroud)
如果我运行这个代码,一切都按预期工作,但我仍然想知道这是否是传递像stringlist这样的对象的"正确"方法?
字符串列表永远不会被释放,我想知道在调试或其他人试图理解代码时,以这种方式传递对象会变得复杂或混乱.