|
Вопрос # 269/ вопрос открыт / |
|
Здравствуйте, уважаемые! Решил поработать со списками. Подскажите как правильно освободить памать по завершении работы.
 |
Вопрос задал: Храмцов Денис (статус: 1-ый класс)
Вопрос отправлен: 16 января 2007, 06:39
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Матвеев Игорь Владимирович
Здравствуйте, hdrus!
Списки TList, TStringList и т.д. поддерживают методы:
.Clear - очистка данных;
.Destroy - виртуальный деструктор от TObject, перегруженный для каждого конкретного класса - освобождает память, занятую объектом;
.Free - метод от TObject, вызывающий Destroy.
Обычно рекомендуют использовать Free, поскольку в нем есть проверка на nil, т.е. если объект не создан Free просто ничего не сделает, тогда как Destroy вызовет исключение.
Ответ #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 (статус: 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...
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|