Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.21;
Скачать: CL | DM;

Вниз

Нехватка памяти   Найти похожие ветки 

 
McSimm2   (2003-07-09 13:27) [0]

Почему, если
написать
setlength(MyMas,1000);
то программа нормально работает, а если

SetLength(MyMas,1);
for i := 1 to 100 do
begin
setlength(MyMas,length(MyMas)+1);
{..}
end;

то вываливается по нехватке памяти ???
В чём беда ?


 
Johnmen ©   (2003-07-09 13:37) [1]

В том, что 100+1<1000


 
McSimm2   (2003-07-09 13:39) [2]

Очепятка - и там и тас 1000


 
Anatoly Podgoretsky ©   (2003-07-09 13:42) [3]

В том, что в первом случае сразу сто, а во втором случае 100 раз по одному + единица. Что такое MyMas?


 
McSimm2   (2003-07-09 13:47) [4]

TMyRec=record
{...}
end;
FMyMas = array of TMyRec;
MyMas: FMyMas



 
Skier ©   (2003-07-09 15:24) [5]

>McSimm2 (09.07.03 13:27)
for i := 1 to 100 do
begin
setlength(MyMas,length(MyMas)+1);
{..}
end;
А что таится за {..} ? Может там баг ?


 
[lamer]Barmaglot ©   (2003-07-09 15:31) [6]

Если мне склероз не изменяет, то length динамического массива перед первым использование дает -1. Поэтому если сначала ему присвоить хотя бы 1, а потом выполнять код, то может быть...
Вообщем ищи завязки между setlength и length. Помню были подобные проблемы в детстве...


 
Переяслов Григорий ©   (2003-07-09 15:33) [7]

> [lamer]Barmaglot © (09.07.03 15:31)
Ты не прав. Length(пустой массив) = 0.

> McSimm2 (09.07.03 13:27)
Ищи баг в другом месте


 
MBo ©   (2003-07-09 15:53) [8]

в FAQ надо внести.

Установил длину, скажем, мегабайт.
Выделено соотв. количество памяти

в цикле немножко увеличиваешь длину
выделяется НОВЫЙ кусок памяти, поскольку в старый уже не влезет.
И так много раз.

Память-то освободится - но когда у системы будет на это время, а пока что ты забьешь ее много.




 
Serginio   (2003-07-09 16:36) [9]

Опять же Все зависит от длины перераспределяемой непрерывной памяти. Если можно выделить памяить сразу за концом динамического массива то все прекрасно иначе выделяется кусок памяти равный новому размеру и копируются данные. В итоге через некоторое время память франментируется и просто не хватает памяти для ее нового выделения. Используй массив (список) кусков выделенной памяти. (Теже проблемы TMemoryStream,TList,TStringList)



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

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

Наверх




Память: 0.48 MB
Время: 0.012 c
1-67800
Dale
2003-07-09 10:12
2003.07.21
MDI - интерфейс


14-67989
Alesander
2003-07-02 17:46
2003.07.21
Подбор паролей в Windows 98


14-67976
Феликс
2003-07-06 16:17
2003.07.21
Опять пугают


3-67671
Jaxtor
2003-06-26 10:45
2003.07.21
TRxQuery


14-68075
Marser
2003-07-04 13:18
2003.07.21
День независимости США