Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.045 c
6-41776
Vyacheslav
2003-09-20 10:47
2003.11.13
работа с ftp


8-41756
Ilg
2003-07-08 10:16
2003.11.13
Преобразование цвета в RGB


6-41796
Fixxxer
2003-09-16 00:41
2003.11.13
есть ли разница в скриптах?


1-41676
Igit
2003-10-24 20:16
2003.11.13
pascal and assembler


1-41696
UNick
2003-11-03 09:10
2003.11.13
Можно ли сделать ListBox полупрозрачным или прозрачным?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский