![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TList & records [D7, XP]
_Андрей © (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]Интересно, почему вы не использовали объекты?