Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TList & records [D7, XP]


Страницы:   1 2

_Андрей ©   (2009-08-07 12:14:00) 

Здравствуйте.

Для хранения списка таких вот записей:

type
 PRasEntry = ^TRasEntry;
 TRasEntry = record
 Name, User, Pswd, Phone: string;
end;


создал наследника TList:

type TRasList = class(TList)
 private
   function ReadItem(index: integer): TRasEntry;
   procedure WriteItem(index: integer; const Value: TRasEntry);
 public
   procedure AddItem(RasEntry: TRasEntry); overload;
   procedure AddItem(Name, User, Pswd, Phone: string); overload;
   property RasItems[index: integer]: TRasEntry read ReadItem write WriteItem;
   destructor Destroy; override;
end;

Вот его реализация:

procedure TRasList.AddItem(RasEntry: TRasEntry);
var P: PRasEntry;
begin
 New(P);
 P^ := RasEntry;
 Add(P)
end;

procedure TRasList.AddItem(Name, User, Pswd, Phone: string);
var P: PRasEntry;
begin
 New(P);
 P^.Name := Name; P^.User := User; P^.Pswd := Pswd; P^.Phone := Phone;
 Add(P)
end;

function TRasList.ReadItem(index: integer): TRasEntry;
begin
 if (index >=0) and (index <= Count-1) then Result := TRasEntry(Items[index]^)
end;

procedure TRasList.WriteItem(index: integer; const Value: TRasEntry);
begin
 if (index >=0) and (index <= Count-1) then
   begin
   TRasEntry(Items[index]^).Name := Value.Name;
   TRasEntry(Items[index]^).User := Value.User;
   TRasEntry(Items[index]^).Pswd := Value.Pswd;
   TRasEntry(Items[index]^).Phone := Value.Phone
   end
end;

destructor TRasList.Destroy;
var i: integer;
begin
 for i:=Count-1 downto 0 do
   begin
   Dispose(Items[i]);
   Delete(i)
   end;
 inherited
end;


Проблема в том что FastMM при добавлении каких-либо элементов в список находит в этом коде утечки памяти, подскажите, плиз, что не так делаю, может у кого-нить есть пример хранения записей в списке...


_Андрей   (2009-08-07 13:18:00) [21]


> Медвежонок Пятачок ©   (07.08.09 13:13) [9]


Наследний был нужен для того, чтобы добавить процедуры добавления новых записей, так намного удобней (много где потом это используется), в опщем лучше здесь сделать здесь чуть больше чтоб потом в самой проге код не захламлять, достаточно написать, например:

RasList.AddItem('mts', 'mts', 'mts', 'pw8w9707070707') и всё...


MBo   (2009-08-07 13:15:00) [22]

>А как Dispose узнаёт "сколько" памяти необходимо освободить?
это "умная" процедура, ей неявно передается информация о типе, и она до освобождения непосредственно выделенной памяти (в данном случае 16 байт под указатели на строки) выполняет Finalize для корректного освобождения (финализации) динамических типов


Медвежонок Пятачок   (2009-08-07 13:13:00) [23]

Ну так здесь и сам наследник TList тоже лишний.
Хватит самого тлиста и обычной процедуры ClearMyList


_Андрей   (2009-08-07 13:07:00) [24]


> Юрий Зотов ©   (07.08.09 12:58) [5]


А как Dispose узнаёт "сколько" памяти необходимо освободить?


> А проще было бы вместо record использовать class, а вместо
> TList - TObjectList.


Мне кажеться это здесь лишнее, записей здесь более чем достаточно, 4 строчки и всё, вот если бы объект был посложнее...


_Андрей   (2009-08-07 13:03:00) [25]

Ага), больше FastMM не ругается, здорово, большущее спасибо..!
А в чём была проблема, понятно в опщем что в 1-м случае освобождалась не вся память, но вот что конкретно дало приведение типа (PRasEntry(Items[i]))? Объясните, если нетрудно, несведущему...


Юрий Зотов   (2009-08-07 13:00:00) [26]

Вдогонку - и если этот class наследовать от TCollectionItem, то вместо списка можно использовать коллекцию. Что лучше - зависит от задачи.


Юрий Зотов   (2009-08-07 12:58:00) [27]

> _Андрей   (07.08.09 12:35) [2]

В деструкторе (точнее, в Dispose), чтобы правильно освободить память и финализировать строки записей нужно явно задать тип указателя (см. [3] и [4]). Иначе используется нетипизированный указатель (поскольку в TList они и есть) и строки записей могут "повиснуть".

А проще было бы вместо record использовать class, а вместо TList - TObjectList.


Игорь Шевченко   (2009-08-07 12:47:00) [28]


> Dispose(Items[i]);


Dispose(PRasEntry(Items[i]))


DVM   (2009-08-07 12:46:00) [29]


> Проблема в том что FastMM при добавлении каких-либо элементов
> в список находит в этом коде утечки памяти, подскажите,
> плиз, что не так делаю


> Dispose(Items[i]);

замени на

Dispose(PRasEntry (Items[i]));


_Андрей   (2009-08-07 12:35:00) [30]


> Kolan ©   (07.08.09 12:27) [1]
> Интересно, почему вы не использовали объекты?


В смысле? О каких объектах речь?


Kolan   (2009-08-07 12:27:00) [31]

Интересно, почему вы не использовали объекты?


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо