![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Частый вызов SetLength(Count+10)
@!!ex © (2007-12-02 19:18:00)Может ли вызвать ошибку?
Просто есть контейнер, доюалвение в который реализовано так:
procedure TNoise.Add(Position:TVector; LifeTime:integer; bSize:single; Const Color:TVector);
begin
inc(Count);
if Count>Size then begin
inc(Size,500);
SetLength(Items,Size);
end;
Items[Count-1]:=TWaterNoise.Create(Position,LifeTime,bSize,Color);
end;
И при этом в него засовывается около 500 объектов.
Проект начал падать, есть основания полагатЬ, что ошибка в контейнере.
Но там ничего страшщного не происходит, кроме такого фигового ресайза массива.
Сергей М. (2007-12-03 10:38:00) [21]
> MBo © (03.12.07 10:30) [12]
D7 - полет нормальный.
MBo (2007-12-03 10:30:00) [22]В BDS2006 сей код отрабатывает без проблем - линейный рост занимаемой процессом памяти, а вот в старых версиях, насколько я помню, менеджер памяти мог не успевать, и рост квадратичный, пока не кончится память. Кто-нибудь проверит на 5-6-7?
procedure TForm2.Button8Click(Sender: TObject);
var
i, s: Integer;
a: array of Integer;
begin
s := 0;
for i := 1 to 100000000 do begin
SetLength(a, i);
s:= s + a[0];
end;
Caption := IntToStr(s);
end;
Leonid Troyanovsky (2007-12-03 09:57:00) [23]
> Riply © (03.12.07 09:45) [10]
> Но тогда виноват не бедный SetLength, а не совсем правильная
> работа с памятью.
Тогда тяжкие обвинения лягут на дельфийский менеджер памяти :)
Скорее всего, автор чего-то не договаривает,
может он, например, потоки использует.
--
Regards, LVT.
Riply (2007-12-03 09:45:00) [24]> [8] Сергей М. © (03.12.07 09:38)
Спасибо.
Но тогда виноват не бедный SetLength, а не совсем правильная работа с памятью.
Так что с него можно снять такие тяжкие обвинения :)
Сергей М. (2007-12-03 09:38:00) [25]
> дефрагментации
К фрагментации, конечно же)
Сергей М. (2007-12-03 09:38:00) [26]
> Riply © (03.12.07 09:32) [7]
Все просто - частое перераспределение памяти ведет к ее дефрагментации, если менеджер памяти не поддерживает (или не полной мере поддерживает) сборку мусора.
Riply (2007-12-03 09:32:00) [27]> [5] Сергей М. © (03.12.07 09:05)
> Может.
Я понимаю, что "краткость - сестра" :),
но все таки, можно по-подробнее ?
Slym (2007-12-03 09:13:00) [28]добавление простое и в нем ошибки нет... а вот удалении смотреть нужно, т.к там не все просто и гладко
Сергей М. (2007-12-03 09:05:00) [29]
> Может ли вызвать ошибку?
Может.
Правильный_Вася (2007-12-02 20:30:00) [30]я когда-то в Д5 сталкивался с проблемами дин массивов
если добавлять мелкими порциями много тысяч элементов, то иногда на AV выпадал
TList не имеет такой бяки
@!!ex (2007-12-02 20:00:00) [31]> [2] Amoeba © (02.12.07 19:41)
То что я не знал о его существовании, когда писал все это.
Сейчас переделывать поздно, ибо завтра сдавать готовый проект надо.
Amoeba (2007-12-02 19:41:00) [32]А какой смысл использовать динамический массив объектов вместо TObjectList?
@!!ex (2007-12-02 19:19:00) [33]опечатка.
inc(Size,10);