Допълнителен въпрос към този въпрос: (имайте предвид, че това не е дубликат , питам за алтернативи тук).
Има ли някакъв начин следното да работи:
type
List <T> = record
private
FList : TList <T>;
FGuard : IInterface,
procedure CheckCreated;
public
procedure Add(const Value : T);
end;
procedure List <T>.CheckCreated;
begin
if (FGuard = nil) then
begin
FList := TList <T>.Create;
FGuard := TGuard.Create (FList); // guard calls free on list in destructor
end;
end;
procedure List <T>.Add (const Value : T);
begin
CheckCreated;
FList.Add (Value);
end;
В идеалния случай искам да го използвам така:
function ReturnHandles : List <THandle>;
begin
Result.Add (2);
Result.Add (3);
end;
Както е обяснено в отговорите на свързания въпрос, това не работи (което наистина е жалко). Няма да създава нов списък при всяко повикване.
За съжаление и това не работи:
function ReturnHandles : List <THandle>;
begin
Initialize (Result);
Result.Add (2);
Result.Add (3);
end;
Изтича интерфейсите на охраната и всички списъци, защото Initialize
просто презаписва препратката към интерфейса, без да намалява броя на препратките.
Има ли някакъв начин това да работи? Или бихте предложили да направите това интерфейс вместо запис и просто да живеете с строителната линия?
function ReturnHandles : List <THandle>;
begin
Result := List <T>.Create;
Result.Add (2);
Result.Add (3);
end;
Благодаря за вашата помощ!
Initialize
е грешка в отговора на gabr. Така че не, не трябва да използвате това. - person David Heffernan   schedule 16.12.2011List.Copy
. Неявните копия се държат по същия начин като препратките (препратката към вътрешния списък се копира), което е доста хубаво. - person jpfollenius   schedule 20.12.2011