Вниз
Скачать: 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 вся ветка

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



Память: 0.47 MB
Время: 0.01 c
14-67970
Начинающий_
2003-07-07 00:00
2003.07.21
Самая длинная ветка в бинарном дереве


14-68036
Sun
2003-07-04 18:57
2003.07.21
Одиночество- это когда есть E-mail,а письма присылает только серв


1-67901
kamchatik
2003-07-07 14:03
2003.07.21
работа с Word


1-67895
Pandemonium
2003-07-08 09:03
2003.07.21
Массив или запись объектов


3-67740
Deedlit
2003-06-30 08:12
2003.07.21
Corrupt file - other than header




   Наверх