Форум: "Основная";
Текущий архив: 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.48 MB
Время: 0.011 c