「適切な」アプローチは、物事がどのように破壊されるかについての独自のルールを確立することです。関数の結果にオブジェクトを作成しても問題ありませんが、厳密な規則に従っている場合に限ります。
あなたの場合、SomeFunction
にメモリリークがあります。まず、TStringList
を作成し、条件が満たされた場合は、最初のものを完全に無視して別のTStringList
を作成します。したがって、メモリが漏れています。
DoSomething
は、すでに文字列リストが作成されている可能性がある場合は、文字列リストを返す関数であってはなりません。
function someFunction: TStringList;
begin
Result:= TStringList.Create;
if someConditionIsTrue then
DoSomething(Result);
//other code
end;
"stringlistsが解放されることはありません"
Iを:あなたは、その後SomeFunction
は次のようになり、それを行うたら代わりに、ちょうど...それ手順
procedure DoSomething(AList: TStringList);
begin
AList.Add(Something);
end;
を作りますこれは設計によるものではないことを望みます。あなたが作成するすべてのものは、特にその結果を作成する関数を持っている場合、ある時点ではfree'dでなければなりません。唯一の例外は、アプリケーションの全期間生存しているものを作成していても、とにかくそれらを解放するための極端な共通点です。そのノートオン
私はそう何回も複製されます複数行のコードをカプセル化していたときに、私が今まで関数の結果でオブジェクトを作成するだけです。たとえば、クエリを作成します。代わりにこのコードを繰り返し
...
Q:= TADOQuery.Create(nil);
Q.Connection:= MyDatabaseConnection;
Q.SetSomeOtherProperties;
が...私は機能にそれを置く...その後
function CreateQuery: TADOQuery;
begin
Result:= TADOQuery.Create(nil);
Result.Connection:= MyDatabaseConnection;
Result.SetSomeOtherProperties;
end;
、私は単純にこの関数を呼び出すことができます私がする必要がある場合は、必ずそのコードを繰り返して...
Q:= CreateQuery;
他の場所で使用することなく、最初のコードサンプルだけで既にメモリリークが発生しています。最初にインスタンスを作成し、その後そのインスタンスを完全に無視して、別のインスタンスを作成します。 –
コードが2つのTStringlistインスタンスを作成しています。これによりメモリリークが発生します。 someFunctionによって返されるものは、 'someConditionIsTrue'の値によって異なります。あなたはdoSomethingの.Createは必要ありません。 – MartynA
"適切な"方法はありません。あなたは**どのパーティーがメモリ**を解放し、厳密にそれに従うかについてのあなたの大会を開発する必要があります。また、コンパイラのヒントに注意する必要があります。最初のスニペットの問題を指摘します。 –