this質問に加えて、私はいくつかのテストとdocwikiの研究を行いました。Delphi関数戻りクラスオブジェクト
function testResultObject: TClassA;
begin
Result := TClassA.Create;
Result.DoSomething;
end;
そしてどこかに、私はこのように上記のコードを呼び出すことができます:私の結論は、この種のコードは、メモリリークせずに動作するはずということであるレミーはそれがより良いの答えで提案されているように
var k: TClassA;
begin
k := testResultObject;
try
//code code code
finally
k.Free;
end;
end;
をこのようなことを避け、testResultObject(x: TClassA): boolean
のようなものを使用してください。この場合、true/falseを返すと、すべてがうまくいって、すでに作成されたオブジェクトを渡していることがわかります。このコードでは
ルック:
function testResultObject: TClassA;
begin
Result := TClassA.Create;
try
Result.DoSomething;
except
Result.Free;
end;
end;
機能の上記の最初のバージョンの問題はDoSomething
は例外を発生させる可能性があり、もしそうなら、私はメモリリークだろうということです。 try-except
で2番目の実装を解決することはできますか?確かに後で結果が割り当てられているかどうかを確認する必要があります。
私は(上記のとおり)testResultObject(x: TClassA): boolean
が良いと同意します。私が書いたように、クラスを返す関数の方法を修正できるかどうかは疑問だった。
個人的に私はいつもより良いコードを読みやすくする第2のアプローチ(true/false return)を使用してきました。あなたの解答は良いですが、例外ブロックにResult:= nilも追加してください。 –
あなたは以前の答えを誤解しています。オブジェクトをパラメータとして渡すことは、そのオブジェクトを変更しているとき(この例では、リストに項目を追加するとき)に有効です。これはまったく異なるシナリオです。 –