Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.10.17;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.047 c
3-1095428871
Morrison
2004-09-17 17:47
2004.10.17
Как реализовать поле с суммой значений из другой таблицы?


3-1095352280
3APA3A
2004-09-16 20:31
2004.10.17
select distinct ...


1-1096470003
Flying-home
2004-09-29 19:00
2004.10.17
New() &amp; Dispose()


14-1096269319
peypivo
2004-09-27 11:15
2004.10.17
Похмелье


14-1096088031
Шишкин Илья
2004-09-25 08:53
2004.10.17
Не могу установить компонент