TObjectList <T>.Count вызывает недопустимую операцию указателя - PullRequest
2 голосов
/ 30 марта 2012

В Delphi 2009 у меня до сих пор не было серьезных проблем с Generics (с использованием списков Generics.Collections без специальных функций Generics).

Теперь я обнаружил, что этот код вызовет «недопустимую операцию указателя» в строке, которая обращается к MyList.Count. (MyList.Contains и MyList.IndexOf вызывают ту же ошибку).

Ошибка исчезнет, ​​если я объявлю TMyList = class(TList<TMyEntry>);

Должен ли я избегать TObjectList<T> или что-то еще в моем коде вызывает эту ошибку?

type
  TMyEntry = class(TStringlist);
  TMyList = class(TObjectList<TMyEntry>);

procedure TListTests.TestAV;
var
  Entry: TMyEntry;
  MyList: TMyList;
begin
  MyList := TMyList.Create;
  try
    Entry := TMyEntry.Create;
    try
      MyList.Add(Entry);
      Assert(MyList.Count = 1);  // <--- fails
    finally
      Entry.Free;
    end;
  finally
    MyList.Free;
  end;
end;

1 Ответ

2 голосов
/ 30 марта 2012

TObjectList named Object Список, поскольку он владеет объектами, которые хранит.так что вы не должны освобождать объекты, список которых содержит себя.TObjectList делает это за вас.Я протестировал пример кода в Delphi2010.И я получаю AV в MyList.free() линии.причина в том, что вы делаете Entry.Free.List не знает об этом и пытается free возразить снова.Конструктор TObjectList s имеет логический параметр ownsObjects (по умолчанию = true), вы можете использовать его и освобождать объекты, которые он содержит вручную.

...