Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.031 c
1-1096885823
Skywalker
2004-10-04 14:30
2004.10.17
Как обойти "Circular unit reference"?


9-1087222996
Uncle Archi
2004-06-14 18:23
2004.10.17
OpenGL


1-1096878217
-=RussT=-
2004-10-04 12:23
2004.10.17
алгоритм...


14-1096263400
Lola
2004-09-27 09:36
2004.10.17
Кажется пора завести дайджест "Самый оригинальный спам" :)


6-1092013221
eRoR_rrr
2004-08-09 05:00
2004.10.17
Состояние Net send





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский