Очищение объектов

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

Допустим заносим в stringlist
3 Объекта
AddObject('1',someojbject1);
AddObject('2',someojbject2);
AddObject('3',someojbject3);

Как теперь их правиль очистить
Просто
Items.Clear

Или

for I:=0 to StringList.Items.Count-1 do
begin
FreeMemory(StringList.Items.Object);
StringList.Items.Object:=nil;
end;
end;
finally
StringList.Items.Clear;
end;
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

:) Можно это легко проверить:
ctrl+click на Clear покажет нам реализацию этого метода:

Код: Выделить всё

procedure TStringList.Clear;
begin
  if FCount <> 0 then
  begin
    Changing;
    Finalize(FList^[0], FCount);
    FCount := 0;
    SetCapacity(0);
    Changed;
  end;
end;
Как мы видим - тут идет очистка только массива строк.

как вариант - можно создать свой класс-наследник TStringList и уничтожать объекты ;)

Код: Выделить всё

  TMyStringList = class(TStringList)
  public
    procedure Clear; override;
  end;

implementation

procedure TMyStringList.Clear;
var
  i: Integer;
begin
  for i := 0 to Count-1 do
  if Assigned(Objects[i]) then
    Objects[i].Free;
  inherited;
end;
Ну и все дополнительные функции типа Delete и т.д. описать подобным образом.
С уважением, Lost Angel...
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Непомню как насчет stringlist, а вот TList нормально работает с объектами и сам за ними чистит, единственное четко не помню методы давно не работал с ним..
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

Duncon, тоже не удаляет ;)

Код: Выделить всё

procedure TList.Clear;
begin
  SetCount(0);
  SetCapacity(0);
end;
С уважением, Lost Angel...
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Не не, там при пработе с объектом методы delete и Remove - вот он как раз данные типа Pointer рушит.. методы типа clear и Delete не освобождают память, только сам список..
Аватара пользователя
Игорь Акопян
Сообщения: 1440
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

Лелик, хелп про Clear содержит:
Description

Call clear to empty the list of strings. All references to associated objects are also removed. However, the objects themselves are not freed.
Objects освобождать вручную, нилить не обязательно
Изображение
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Типа можно утечку памяти словить..
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

Т.е они получаются все время в памяти сидият?
Блин наткнулся напрогу одну, а там такой метод очищения стоит.
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
Duncon
Сообщения: 2085
Зарегистрирован: 10 окт 2004, 14:11
Откуда: Питер
Контактная информация:

Да сидят..
Юзай Remove
Лелик_1044
Сообщения: 340
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

FreeMemory(treeview.items.item.data);
Иногда ошибка выскакивает
Из чего может быть?
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Ответить