Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.04.07;
Скачать: 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 вся ветка

Текущий архив: 2003.04.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.014 c
3-19452
БАА
2003-03-15 17:50
2003.04.07
Выборка единственной строки из многих....


14-19853
Val
2003-03-21 10:04
2003.04.07
Скажи спасибо армии США!


3-19471
Staraya
2003-03-18 12:18
2003.04.07
Как сделать DBNavigator активным


1-19603
xfrost
2003-03-28 18:31
2003.04.07
Таблицы в MS Word


1-19538
Маркыч
2003-03-26 18:28
2003.04.07
CoolBar