Дополнительный вопрос к этому вопросу: (обратите внимание, что это не дубликат , я прошу альтернативы здесь).
Есть ли способ сделать следующую работу:
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
было ошибкой в ответе габра. Так что нет, вы не должны использовать это. - person David Heffernan   schedule 16.12.2011List.Copy
. Неявные копии ведут себя так же, как ссылки (внутренняя ссылка на список копируется), что весьма приятно. - person jpfollenius   schedule 20.12.2011