您可以創建一系列帶有2,3,4等參數的重載版本。例如:
procedure CreateStringLists(var L1, L2: TStringList); overload;
procedure CreateStringLists(var L1, L2, L3: TStringList); overload;
procedure CreateStringLists(var L1, L2, L3, L4: TStringList); overload;
procedure CreateStringLists(var L1, L2: TStringList);
begin
L1 := nil;
L2 := nil;
Try
L1 := TStringList.Create;
L2 := TStringList.Create;
Except
FreeAndNil(L2);
FreeAndNil(L1);
raise;
End;
end;
// etc.
如果我這樣做,我會寫一個腳本來生成代碼。另外,在我自己的代碼中,我會在該函數的開始處編寫InitialiseNil(L1, L2)
,在異常處理函數中編寫FreeAndNil(L2, L1)
。 InitialiseNil
和FreeAndNil
是由一個非常簡單的Python腳本生成的函數,該腳本作爲註釋包含在代碼庫中,以便它可以重新運行。像上面定義的CreareStringLists
這樣的程序只有在你有一個匹配的例程才能一次性釋放它們時纔有用。這允許你寫:
CreateStringLists(L1, L2);
Try
// do stuff with L1, L2
Finally
FreeAndNil(L2, L1);
End;
最後,我不是說我一定會做到這一點,但是這意味着作爲一個天真的和直接的問題的答案。作爲@ T.E.D。狀態,這樣做的需要表明代碼庫中存在更深層次的問題。
+1我懷疑自己可以這樣做,但它很安全,很偷偷摸摸 - 很好! – 2011-01-05 20:30:02
+1你打敗了我!我現在有我自己的基於普通指針的實現,我只是將它升級到使用指向TStringList的指針時注意到你的答案。 :) – jachguate 2011-01-05 20:39:55
我認爲,當然,您必須在CreateStringLists過程中使其異常感知,因此所有這些都成功創建,或者在以特殊方式退出例程之前釋放所有已創建的過程。 – jachguate 2011-01-05 20:41:59