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

Вниз

Освобождение памяти, инициализированной 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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.02 c
1-98634
off
2003-10-17 14:37
2003.10.30
Вывод на печать?


1-98711
Alesha aka Pokemon
2003-10-21 09:30
2003.10.30
Компонент TurboPower Product Suite


3-98477
suharew
2003-10-07 23:01
2003.10.30
Ошибки


14-98838
Soft
2003-10-11 15:33
2003.10.30
Айл би бэк сказал один, или Терминатор - губернатор Калифорнии.


1-98674
ИМГусак
2003-10-21 13:21
2003.10.30
Простите, очень срочно