Форум: "Основная";
Текущий архив: 2003.04.07;
Скачать: [xml.tar.bz2];
ВнизОсвобождение памяти Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.008 c