Вниз
Скачать: CL | DM;

Освобождение памяти   Найти похожие ветки 

← →
SS   (2003-03-26 11:28) [0]

Люди! Вопрос наверное очень лоховский, но решение я самостоятельно не нашел. Помогите разобраться с ситуацией
Unit 1
........
type W_Arr = array [0..1000] of word;
Refresh = array of W_Arr;
var
Out : Refresh;
..............
SetLength(Out,100);
...............

unit2
.......................
type MyThread = class (TTread);
proc Execute; override;
end;
proc MyThread.Execute;
begin
// запись в Out;
..........
// Теперь надо освободить память из под 100 элементов Out
for i := 0 to 99 do Out[i]:= nil; ???!!! // Возникает ошибка
// FreeMem(Out[i][0]); - тоже ошибка
end;
Какие еще могут быть варианты? Одновременно в Out пишет (но в другие элементы) еще один поток. Рост массива Out неограничен и каждый его элемент весит 64 к, так что память может быстро кончится.


← →
kull ©   (2003-03-26 11:33) [1]

А так не помогает?
Out := nil;
И все!


← →
REA ©   (2003-03-26 11:39) [2]

Out[i] статический массив и применение к нему конструкции := Nil весьма сомнительно...


← →
Smithson ©   (2003-03-26 12:00) [3]

Out как раз динамический массив и применение к нему конструкции nil вполне законно. Вот его элементы - статические массивы.


← →
SS   (2003-03-26 12:13) [4]

to kull
Out нужен. Не нужны его элементы, которые уже отработаны, но жрут память. Заменить элементы Out на динамические массивы можно, но это отражается на быстродействии программы в целом.


← →
REA ©   (2003-03-26 12:19) [5]

Out - динамический. Out[i] - статический.

Советую в данном случае сделать список TObjectList из объектов полем которых является массив array [0..1000] of word, который целесообразно сделать динамическим, если размер заранее не известен.

>Заменить элементы Out на динамические массивы можно, но это отражается на быстродействии программы в целом.
- Не вижу особой разницы в быстродействии при использовании динамических и статических массивов.


← →
Smithson ©   (2003-03-26 12:24) [6]

Out нужен. Ну и вперед:

Out := nil; // не жрут уже память
SetLength(Out, 3); // Жрут


← →
SS   (2003-03-26 12:26) [7]

Мне сначала тоже так казалось. Out[i][0] передается функции в качестве параметра, и она заполняет Out[i]. Функция зашита в DLL писаной на С и объявлена как stdcall. Проверял время выполнения N > 1000 циклов, со статическими элементами Out время меньше


← →
SS   (2003-03-26 12:33) [8]

to Smithson
Ну и куда после Out :=nil у меня потоки будут писать? По новому адресу? А тем более читать? Не МОГУ я коцать буфер (Out) куда ПОСТОЯННО идет запись, и постоянно идет чтение. Вопрос в том, как освободить память от элемента, если он уже записан и прочитан. Вариант про созлание каждый раз массива [0..1000] of word, затем его запись, чтение и изничтожение не проходят, так как пишуший поток имеет высокий приоритет, а поток чтения - Idle => соответственно запись будет стоять пока МЕДЛЕННО не произойдет считывание такого массива


← →
kull ©   (2003-03-26 12:35) [9]

to SS
SetLength(Out, 0);
аналогично
Out := nil;


← →
kull ©   (2003-03-26 12:42) [10]

Что-то я не совсем понял что тебе надо?

Ты говоришь память тебе надо освободить, и тут же спрашиваешь - "...куда потоки будут писать?"

И причем здесь адрес? Есть переменная Out в из нее читай, в нее и пиши.


← →
SS   (2003-03-26 12:50) [11]

Кратко пытаюсь еще раз сформулировать. Можно ли освободить память, занимаемую элементом динамического массива, если сам элемент является статическим массивом.

если этот элемент - динамический массив, то все просто
Out[i] := nil; и все
По Out [i+1] я могу и прочитать и записать. Можно ли что то сделать по анологии, если out[i] = array [0..N] of word?


← →
Smithson ©   (2003-03-26 12:54) [12]

[b]НЕТ[/b]


← →
SS   (2003-03-26 13:01) [13]

Спасибо за краткость :))


← →
kull ©   (2003-03-26 13:05) [14]

Ну можешь так сделать:

type
W_Arr = array [0..1000] of word;
PW_Arr = ^W_Arr;
Refresh = array of PW_Arr;
var
Out: Refresh;


тогда можно для i - го элемента:

New(Out[i]);
....................
Dispose(Out[i]);




← →
SS   (2003-03-26 13:11) [15]

Мерсю, надо попробовать



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

Скачать: CL | DM;



Память: 0.48 MB
Время: 0.012 c
1-19653
___ALex___
2003-03-25 20:56
2003.04.07
For gruener


1-19544
Дядя Будда
2003-03-26 17:35
2003.04.07
Защита печатной формы


8-19700
BirdNickOff
2003-01-04 00:58
2003.04.07
Как в Delphi переделать рисунок из 24 бит в 8 бит?


1-19626
Step[B.M.]
2003-03-23 03:26
2003.04.07
DLL. Проблемы с строковыми типами.


1-19610
StarCon
2003-03-19 12:21
2003.04.07
Передача данных в DLL




   Наверх