Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.007 c
1-19649
Мыш
2003-03-25 10:44
2003.04.07
рисование


3-19423
Денис
2003-03-18 10:54
2003.04.07
Ошибка


1-19554
race1
2003-03-26 13:15
2003.04.07
property


3-19449
Siv Soft
2003-03-17 18:14
2003.04.07
Данные из InterBase в MSSQL


3-19498
Smalik
2003-03-19 15:20
2003.04.07
База данных - риторический вопрос.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский