Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Вниз

Освобождение памяти, инициализированной New()   Найти похожие ветки 

 
Донской   (2003-10-20 17:18) [0]

День добрый, мастера!
У меня есть тип

pt=^t1;
t1=record
r:real;
prev,next:pt;
end;

и есть переменная , которая у меня указывает на голову массива

var a=pt;


я создаю длинный массив и убеждаюсь, что объем памяти, занимаемый программой, увеличивается.
Как избавиться от массива, освободив пямять?
простое dispose(a) или a:=nil
не помогают (да и не должны)

массив для программы теряется, а память остается занятой.

С уважением!


 
Skier   (2003-10-20 17:21) [1]

Сдаётся мне что это обыкновенный двусвязный список.
А о нём столько написано, столько написано, столько написано...:)


 
clickmaker   (2003-10-20 17:22) [2]

мож все-таки

var a: array of t1 + SetLength(a

?

присвоение nil динамическому массиву память освобождает


 
MBo   (2003-10-20 17:22) [3]

освобождать нужно каждый элемент списка


 
Донской   (2003-10-20 17:23) [4]

Да,
двусвязный....
Написано?
По словам "Двусвязный список" я еще не искал...


 
Плохиш_   (2003-10-20 17:23) [5]

Надо освободить память для каждого созданного элемента массива вызовом ф-ции Dispose.


 
Юрий Федоров   (2003-10-20 17:26) [6]

рекурсивно


 
Донской   (2003-10-20 17:27) [7]

Хех...
Прогнать по всемму массиву и каждому Dipose?
Уж больно долгая процедура для простого освобождения паямти.
Предложение Clickmaker"a не подходит.
Приведенный мной пример - прост, а у меня целая стуркутра данных построена на этом массиве.
И очень часто нужно убивать куски из середины этого массива.
А array of этого не позволяет (или очень не уджобен, если все-таки изловчиться)


 
Донской   (2003-10-20 17:29) [8]

Что ж.
если других вариантов нет...
придется, действительно,
прогонять весь массив.


 
Skier   (2003-10-20 17:30) [9]

>Донской © (20.10.03 17:27) [7]
Нужно лишь сохранять указатель на "голову" списка и с помощью
этой головы освобождать весь список. И всё !


 
Palladin   (2003-10-20 17:32) [10]

используй TList если так уж не удобно


 
Малиновский Владимир   (2003-10-20 17:42) [11]

Типа, если лень, то используйте не запись, а класс, в котором с реализацией вашего деструктора, который и будет все освобождать, когда его попросите.


 
Донской   (2003-10-20 17:46) [12]

О,
я тоько хотел вписать код,
но предумал, уж больно много кода получается.
у меня все эти массивы - свойства класса.
ТОлько дело все в том, однако, что класс "сам" освобождать ничего не буде - класс-то я сам и создаю, следовательно,
если я создаю метод
procedure "Осовбоди-ка мне память";
, то и тело этого метода Я пишу.
Или нет? :-))))
Поэтому-то я сюда с такми вопросом и пришел.

Ну ясно в общем...


 
Донской   (2003-10-20 17:47) [13]

О,
я тоько хотел вписать код,
но предумал, уж больно много кода получается.
у меня все эти массивы - свойства класса.
ТОлько дело все в том, однако, что класс "сам" освобождать ничего не буде - класс-то я сам и создаю, следовательно,
если я создаю метод
procedure "Осовбоди-ка мне память";
, то и тело этого метода Я пишу.
Или нет? :-))))
Поэтому-то я сюда с такми вопросом и пришел.

Ну ясно в общем...

Типа...


 
DVM   (2003-10-20 18:01) [14]


> Хех...
> Прогнать по всемму массиву и каждому Dipose?
> Уж больно долгая процедура для простого освобождения паямти.

Это не долго. Это очень-очень быстро. Миллионы и миллионы ячеек за время менее одной секунды.


 
Ломброзо   (2003-10-20 18:08) [15]

ну вот еще решение - маленький классик, выделяющий память для вашегой массива одним большим пулом. GetMem, FillChar нулём, FreeMem в конце работы. Нужно написать единственный метод, возвращающий указатель на текущую границу пула свободной памяти для каждого элемента и опосля сдвигающий границу пула на sizeof(t1)

Если мне не изменяет склероз, в TP были Mark и Release. Куда они подевались и в какой версии?


 
Малиновский Владимир   (2003-10-20 18:09) [16]

Ну что там за сложный код?
Типа:

type
TMyClass = class(TObject)
Field : integer;
Wild : string;
PrevMyClass : TMyClass;
NextMyClass : TMyClass;
public
destructor Destroy; override;
destructor Destroy; override;
end;

...

implementation

{ TMyClass }

destructor TMyClass.Destroy;
begin
if Assigned(PrevMyClass) then begin
PrevMyClass.Destroy;
PrevMyClass := nil;
end
if Assigned(NextMyClass) then begin
NextMyClass.Destroy;
NextMyClass := nil;
end
inherited;
end;


 
Skier   (2003-10-20 18:12) [17]

Извращенцы ! :)
для такой записи
t1=record
r:real;
prev,next:pt;
end;
использовать классы !

"Не перепились ещё богатыри на Руси !"


 
Малиновский Владимир   (2003-10-20 18:13) [18]

Да, мы такие!


 
Донской   (2003-10-20 18:26) [19]

Не, все гораздо круче.
Там в полях хранится мно-0-го всякой инцормации.
В следующий раз чтобы не возникало идей типа "Ну, это же фигня... а не массив, для него нет смысла класс использовать"
короче,
вот код

TTestID=string;

tfldata=record
f:real;
l:real;
end;

ptonedata=^tonedata; {



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

Форум: "Основная";
Текущий архив: 2003.10.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.015 c
4-98921
SH
2003-08-26 17:35
2003.10.30
Есть ли в лотке CDROM компакт-диск?


1-98679
Ev1972
2003-10-21 13:32
2003.10.30
StretchDraw: как копировать часть рисунка?


1-98570
lasso
2003-10-20 11:58
2003.10.30
help


1-98591
kull
2003-10-17 14:35
2003.10.30
Проблема с модальными окнами!


3-98446
Марат
2003-10-10 14:53
2003.10.30
SQL result





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