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

Вниз

Корректное освобождение памяти   Найти похожие ветки 

 
esVer ©   (2003-10-29 16:49) [0]

Допустим, есть две записи разного размера:
TRec1=record
field1 : integer;
field2 : boolean;
end;
PRec1=^TRec1;

TRec2=record
field1 : integer;
field2 : boolean;
field3 : TdateTime;
end;
PRec2=^TRec2;

В список TList помещаются указатели на обе эти записи.
var
List : TList;
p1 : PRec1;
p2 : PRec2;
begin
List := TList.Create;
New(p1); List.Add(p1);
New(p2); List.Add(p2);
...

Корректно ли высвободится "отъетая" память при использовании
метода Dispose следующим образом:

for i:=0 to Pred(List.Count) do
Dispose(List(i));

??


 
Skier ©   (2003-10-29 16:52) [1]


> Корректно ли высвободится "отъетая" память

Да. Менеджер памяти Delphi сам "знает" сколько ему нужно освободить памяти по указателю.


 
esVer ©   (2003-10-29 16:54) [2]

Спасибо.


 
LastLamer ©   (2003-10-29 19:43) [3]

нет, некорректно - правильно писать так:
for i:=0 to Pred(List.Count) do
Dispose(List(0));


 
LastLamer ©   (2003-10-29 19:48) [4]

точнее так
for i:=0 to Pred(List.Count) do
begin
Dispose(List(0));
List.Remove(0);
end;


 
panov ©   (2003-10-29 20:23) [5]

>LastLamer © (29.10.03 19:43) [3]

И в чем же выражается некорректность?


 
Anatoly Podgoretsky ©   (2003-10-29 21:08) [6]

LastLamer © (29.10.03 19:43) [3]
Вот это особенно не корректоно,

LastLamer © (29.10.03 19:48) [4]
а это очень неэффективно, что по сути означает неправильно

У автора сделано правильно.


 
Юрий Зотов ©   (2003-10-29 22:03) [7]

> LastLamer © (29.10.03 19:48) [4]

А Вы сами пробовали так сделать? Попробуйте. Есть подозрение, что получите ошибку - или List index out of bounds (0), или Access Violation. Скорее, первое.


 
Тимохов   (2003-10-30 16:41) [8]

Извините, что залез в уже обсужденный вопрос, но хочу сказать, что в ОБЩЕМ СЛУЧАЕ вы не правы поясню примеом (можете попробовать):
or i:=0 to Pred(List.Count) do
Dispose(List(i));

Делать так можно только если в записи нет строк, интерфейсов и дин. массивов.

В случае елси в записи есть строка, то память из под нее освобождаться не будет.
Надо делать так
var
Item: PRec1;

...
begin
for ...
begin
item := list[i];
dispose(item);
end;
end;

в указанном примере утечки не будет.


 
Тимохов   (2003-10-30 16:44) [9]

Дополнение к Skier:
-------------------
Вы безусловно правы: менеджер освободит память, занятую записью. Но при этом он не освободит динамические объекты из записи (строки и т.д.)


 
Skier ©   (2003-10-30 16:45) [10]


> В случае елси в записи есть строка, то память из под нее
> освобождаться не будет.

Ерунда !


 
Тимохов   (2003-10-30 16:47) [11]

Проверь:

type
titem1 = record
s: string;
end;
pitem1 = ^titem1;

procedure TForm1.Button2Click(Sender: TObject);
var
l: tlist;
k: pitem1;
i: integer;
begin
showmessage(IntToStr(AllocMemSize));
l := tlist.create();
for i := 0 to 100000 do
begin
new(k);
k.s := "любая строка";
l.add(k);
end;
for i := 0 to 100000 do dispose(l[i]);
l.free();
showmessage(IntToStr(AllocMemSize));
end;


 
Тимохов   (2003-10-30 17:14) [12]

Товарищи, корефеи!
Ну разве я не прав?



Страницы: 1 вся ветка

Текущий архив: 2003.11.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.031 c
3-41090
Peter
2003-10-23 13:26
2003.11.13
Лошок...;)


1-41655
Alles
2003-10-25 15:46
2003.11.13
Что за библиотека ToolIntf


4-42267
Dark Elf
2003-09-18 16:54
2003.11.13
SHBrowseForFolder


7-42193
alexsandri
2003-08-22 21:11
2003.11.13
Беда такая : Есть Большая куча Mp3 dв одной папке необходимо расс


3-40929
DelphiNew
2003-10-25 14:37
2003.11.13
Type mismatch in expression