Главная страница
    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.03 c
14-41915
icebeerg
2003-10-21 13:30
2003.11.13
О списании


3-40951
Slim
2003-10-24 21:47
2003.11.13
Проблема выбора?


1-41326
UnixManiac
2003-10-31 01:08
2003.11.13
Не хочет работать TMediaPlayer


1-41440
Petrovitch
2003-10-29 12:33
2003.11.13
Как записать данные прямо в EXE-шник


3-40807
Sour
2003-10-26 12:30
2003.11.13
Embarcadero ERStudio работа с IB через ODBC





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