Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
ВнизTList Найти похожие ветки
← →
Simon (2004-10-06 08:28) [0]Подскажите TList уничтожает хранимые элементы или я сам должен удалять их из памяти
← →
Digitman © (2004-10-06 08:31) [1]уничтожает
← →
ЮЮ © (2004-10-06 08:55) [2]если только они не хранят указатели на объекты: указатели уничтожатся, объекты нет. Для "хранения" объектов см. TObjectList
← →
Simon (2004-10-06 08:55) [3]Спасибо
← →
ЮЮ © (2004-10-06 08:57) [4]Не за что, даже если там указатели на динамически выделенные record-ы, выделенная под них память тоже не освободится.
← →
Evgeny V © (2004-10-06 09:08) [5]Вопрос несколько туманен, но надеюсь понял его.
Сорри, для дельфи 7 не знаю, но думаю это осталось так же как и в 6 версии.
При вызове Tlist.Delete просто уменьшает счетчик элементов в своем списке, если надо (Index < Count) реорганизует cписок указателей, освобождения памяти, распредленной под твой указатель для твоих данных, занесенный в TList не происходит. Это лежит на тебе, твоей программе.
Если имелось ввиду освобождение памяти самого TList, распределенной под хранения указателей, то и в этом случае не происходит освобождение памяти, смотри Capasity. При вызове СLear происходит освобождение памяти, распредленной под хранение указателей, но память ассоцированную с указателями ты так же должен освобождать сам
Это пример кода, часть только из хелпа по Tlist метод Add, в конце есть и следущие строки.
for B := 0 to (MyList.Count - 1) do
begin
ARecord := MyList.Items[B];
Dispose(ARecord);// освобождение памяти ассоциированной с указателем
end;
← →
Amoeba © (2004-10-06 11:27) [6]TList не может сам уничтожать хранимые элементы. Это верно для всех версий Delphi от 1-й до 7-й, посколько иначе и быть не может. Ведь по определению TList не знает и не может знать, что в нем хранится ("обычные" указатели или объекты).
← →
begin...end © (2004-10-06 11:40) [7]
> [6] Amoeba © (06.10.04 11:27)
TList уничтожает хранимые элементы, поскольку он хранит указатели :-)
← →
Мастер © (2004-10-06 11:44) [8]>begin...end © (06.10.04 11:40) [7]
Понятно ведь, что автор топика имел ввиду - некоторые объекты, на которые ссылаются TList.Items.
Остальное - словоблудие.
← →
Мастер © (2004-10-06 11:44) [9]Удалено модератором
← →
Pentium133 © (2004-10-06 11:44) [10]
> begin...end © (06.10.04 11:40) [7]
Бред
Ничего он не уничтожает.
← →
Amoeba © (2004-10-06 11:47) [11]
> begin...end © (06.10.04 11:40) [7]
Ерунда! Хранить указатели еще не значит знать как освободить память, на которую они указывают и уничтожить хранимые элементы. Не надо путать с TObjectList.
← →
Pentium133 © (2004-10-06 11:49) [12]
> Amoeba © (06.10.04 11:47) [11]
А TObjectList сам уничтожает объекты?
← →
Amoeba © (2004-10-06 11:52) [13]
> Pentium133 © (06.10.04 11:49) [12]
Если установить необходимое св-во в True - то да!
← →
begin...end © (2004-10-06 11:53) [14]Дорогие мои, я ничего не путаю. Я говорю, что TList хранит УКАЗАТЕЛИ. И память, занимаемую УКАЗАТЕЛЕМ (4 байта), он успешно освобождает.
← →
Amoeba © (2004-10-06 11:56) [15]Удалено модератором
← →
begin...end © (2004-10-06 11:57) [16]Удалено модератором
← →
Amoeba © (2004-10-06 12:07) [17]Удалено модератором
← →
begin...end © (2004-10-06 12:09) [18]Удалено модератором
← →
Плохиш © (2004-10-06 12:14) [19]Удалено модератором
← →
Плохиш © (2004-10-06 12:15) [20]Удалено модератором
← →
Sectey © (2004-10-06 12:18) [21]:-( Я не вижу здесь кода удаления(уничтожения) объектов на которые указывает элемент списка TList
destructor TList.Destroy;
begin
Clear;
end;
procedure TList.Clear;
begin
SetCount(0);
SetCapacity(0);
end;
procedure TList.Delete(Index: Integer);
var
Temp: Pointer;
begin
if (Index < 0) or (Index >= FCount) then
Error(@SListIndexError, Index);
Temp := Items[Index];
Dec(FCount);
if Index < FCount then
System.Move(FList^[Index + 1], FList^[Index],
(FCount - Index) * SizeOf(Pointer));
if Temp <> nil then
Notify(Temp, lnDeleted);
end;
procedure TList.SetCapacity(NewCapacity: Integer);
begin
if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then
Error(@SListCapacityError, NewCapacity);
if NewCapacity <> FCapacity then
begin
ReallocMem(FList, NewCapacity * SizeOf(Pointer));
FCapacity := NewCapacity;
end;
end;
procedure TList.SetCount(NewCount: Integer);
var
I: Integer;
begin
if (NewCount < 0) or (NewCount > MaxListSize) then
Error(@SListCountError, NewCount);
if NewCount > FCapacity then
SetCapacity(NewCount);
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
else
for I := FCount - 1 downto NewCount do
Delete(I);
FCount := NewCount;
end;
← →
begin...end © (2004-10-06 12:19) [22]
> [21] Sectey © (06.10.04 12:18)
И не увидишь.
← →
Sectey © (2004-10-06 12:25) [23][b]begin...end © [/b]
Вот и получается, что объекты на которые ссылается элемент TList нужно уничтожать вручну. [b]Так?[/b]
← →
begin...end © (2004-10-06 12:28) [24]Удалено модератором
← →
Плохиш © (2004-10-06 12:29) [25]Удалено модератором
← →
Amoeba © (2004-10-06 12:32) [26]Удалено модератором
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.10.17;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.036 c