Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Фокусы от TObjectList / 10 сообщений из 10, страница 1 из 1
16.11.2018, 12:28
    #39734013
Jagare
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
Вот класс
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
...
type
  TMyObject = class(TObject)
    private
      FI: Integer;
      FObj: TObject;
    public
      constructor Create;
      destructor Destroy; override;
      procedure SetI(AValue: Integer);
      property I: Integer read FI write SetI;
  end;

implementation

{ TMyObject }

constructor TMyObject.Create;
begin
  inherited;
  FObj := TObject.Create;
end;

destructor TMyObject.Destroy;
begin
  FreeAndNil(FObj);
  inherited;
end;

procedure TMyObject.SetI(AValue: Integer);
begin
  FI := AValue;
end;
...


Вот его добавление в дженерик типа TObjectList:


В чём моя вина? Я хочу чтобы TObjectList уничтожал свои айтемы как следует. Для того и написал ObjList := TObjectList<TMyObject>.Create( True ). Что на самом деле он творит? Чего я не понимаю?
...
Рейтинг: 0 / 0
16.11.2018, 12:36
    #39734022
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
JagareВ чём моя вина? Я хочу чтобы TObjectList уничтожал свои айтемы как следует. Для того и написал ObjList := TObjectList<TMyObject>.Create( True ). Что на самом деле он творит? Чего я не понимаю?
Вина в том, что TObjectList ничего не знает про переменную TMyObj и, соответственно, после ObjList.Clear она становится не валидной, но пока в другом месте программы этот участок памяти не будет использован повторно, то по адресу в ней будут лежать данные исходного объекта.
...
Рейтинг: 0 / 0
16.11.2018, 12:41
    #39734029
Jagare
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
alekcvp, то есть всё в порядке, память свободна?
...
Рейтинг: 0 / 0
16.11.2018, 12:44
    #39734033
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
Jagarealekcvp, то есть всё в порядке, память свободна?
Какая версия дельфей? Если новая (XE+), то в проекте первой строчкой вставьте
Код: pascal
1.
  ReportMemoryLeaksOnShutdown := True;


и запустите программу, тогда в конце она скажет - свобдона или нет.
Если дельфи старая, то надо скачать и подключить к проекту FastMM и потом то же самое.

Вкратце: да, память свободная.
...
Рейтинг: 0 / 0
16.11.2018, 12:44
    #39734034
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
Туплю, там же дженерики :)
...
Рейтинг: 0 / 0
16.11.2018, 12:49
    #39734043
goldmi45
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
Jagare, если у TObjectList OwnsObjects стоит true, то при вызове методов удаления объектов TObjectList будет вызывать деструктор объектов, добавленных в него. Это вы легко можете проверить, поставив брейкпоит в деструкторе объекта TMyObject. То, что переменная не nil, так её в этот nil никто не установил.
Jagareто есть всё в порядке, память свободна? Да. FreeAndNil(MyObj) не нужно вызывать.
...
Рейтинг: 0 / 0
16.11.2018, 12:51
    #39734051
makhaon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
Jagare,

авторЧего я не понимаю?
скорее всего ты видишь мусор разрушенного объекта
...
Рейтинг: 0 / 0
16.11.2018, 12:52
    #39734054
Jagare
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
alekcvp, так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.


Так сделал, ничего не говорит
...
Рейтинг: 0 / 0
16.11.2018, 12:52
    #39734055
JayDi
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
Все впорядке, просто отдельная ссылка на объект указывает на память, которую еще не успели засорить. Кстати, true в create можно не писать. Clear перед freeandnil можно не вызывать.
...
Рейтинг: 0 / 0
16.11.2018, 12:53
    #39734060
Jagare
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Фокусы от TObjectList
Сам себя задурил! Благодарю всех за ответы)
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Фокусы от TObjectList / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]