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