Форум: "Основная";
Текущий архив: 2003.11.13;
Скачать: [xml.tar.bz2];
ВнизКорректное освобождение памяти Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.03 c