Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 269

/ вопрос открыт /

Здравствуйте, уважаемые! Решил поработать со списками. Подскажите как правильно освободить памать по завершении работы.

Храмцов Денис Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Храмцов Денис (статус: 1-ый класс)
Вопрос отправлен: 16 января 2007, 06:39
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович

Здравствуйте, hdrus!

Списки TList, TStringList и т.д. поддерживают методы:

.Clear - очистка данных;
.Destroy - виртуальный деструктор от TObject, перегруженный для каждого конкретного класса - освобождает память, занятую объектом;
.Free - метод от TObject, вызывающий Destroy.

Обычно рекомендуют использовать Free, поскольку в нем есть проверка на nil, т.е. если объект не создан Free просто ничего не сделает, тогда как Destroy вызовет исключение.

Ответ отправил: Матвеев Игорь Владимирович (статус: Студент)
Время отправки: 16 января 2007, 14:46

Ответ #2. Отвечает эксперт: Вадим К

Какие именно списки вы использовали? Если TList, то незабывайте, что он не чистит память за вашими объектами. Тоесть вы должны сделать сами. Предыдущий эксперт об этом умолчал. Наиболее правильным считается такое удаление
Пусть TMyClass - это наш класс, экземпляры которого хранятся в списке. Тогда, если добавление выглядит так
m:TMyClass;
...
m:=TMyClass.Create;
List.Add(m);

то в конце зачищаем память так:
for i:=list.count-1 downto 0 do
begin
TMyClass(list).free;
list.delete(i);
end;
Почему сзаду наперёд? Количество элементов уменьшается, и когда вы перейдёте за середину списка, то будут удалятся уже не те элементы и будет большой Access Violation

Если же вы создали свои структуры и их организовали в виде связаных списков, то тут нужно смотреть, что именно вы создали. В одних случаях лучше сзаду начинать (с хвоста)

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 16 января 2007, 15:05


Мини-форум вопроса

Всего сообщений: 5; последнее сообщение — 30 января 2007, 19:01; участников в обсуждении: 5.
Николай Рубан

Николай Рубан (статус: 10-ый класс), 16 января 2007, 10:29 [#1]:

Все очень просто:

var SList:TStringList;
begin
SList:=TStringList.Create; //создаем

.............//делаем нужные преобразование

SList.Free; //освобождаем память
end;

Good Luck!!!
mvp

mvp (статус: 4-ый класс), 17 января 2007, 16:34 [#2]:

а если var f: ^SomElem; и new(f);...; list.add(f), то
for i := list.count - 1 downto 0 do dispose(list[i]);
list.free
Матвеев Игорь Владимирович

Матвеев Игорь Владимирович (статус: Студент), 18 января 2007, 03:47 [#3]:

>Вадим К:
>то незабывайте, что он не чистит память за вашими объектами.
>Тоесть вы должны сделать сами.
>Предыдущий эксперт об этом умолчал.

Неужели у кого-то может сложиться впечатление, что список сам будет очищать объекты, указатели на которые в него добавленны? Это же само сабой должно быть понятно - если, например, список уже не нужен, это не значит, что объекты тоже не нужны.
Вадим К

Вадим К (статус: Академик), 18 января 2007, 11:30 [#4]:

Не соглашусь с вами, Матвеев Игорь Владимирович. К примеру в модуле Contnrs есть набор классов, производных от TList. Так вот к примеру TObjectList удаляет за собой. Главное что бы его элементы были наследниками TObject(тобышь любой делфовский класс)
Галочка "подтверждения прочтения" - вселенское зло.
Виталик

Виталик (статус: Посетитель), 30 января 2007, 19:01 [#5]:

А ещё есть TCollection, тип элементов - TCollectionItem, а ещё - TComponentList тип элементов - TComponent...

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:57
Выполнено за 0.03 сек.