GameHunter писал(а):
В программе (см. attachment) ARRAY OF ARRAY OF LONGREAL размещается
в куче несколько раз. Это приводит к утечке памяти. Размер массива довольно большой.
Добавил вывод значения factor и запустил со значениями 27..30:
Код:
D:\AlexIljin\XdsMemLeakBug>Example.exe
factor = 27
156396648
312711376
312711376
469026104
469026104
469026104
469026104
469026104
469026104
469026104
D:\AlexIljin\XdsMemLeakBug>Example.exe
factor = 28
168187040
336292160
336292160
504397280
504397280
672502400
504397280
672502400
504397280
672502400
D:\AlexIljin\XdsMemLeakBug>Example.exe
factor = 29
180406072
360730224
360730224
541054376
360730224
541054376
360730224
541054376
360730224
541054376
D:\AlexIljin\XdsMemLeakBug>Example.exe
factor = 30
193053744
386025568
386025568
578997392
#RTS: unhandled exception #18: out of heap space
File errinfo.$$$ created.
Судя по всему, из-за большого объёма блока просто-напросто накапливается фрагментация кучи.
На значении 13 видно, как система постепенно идёт вразнос:
Код:
factor = 13
36338360
36338360
72594800
72594800
108851240
108851240
145107680
145107680
145107680
145107680
А вот, скажем, на 27 (см. выше) вполне неплохо работает.
Так что, это не утечка, а фрагментация. Выделяйте блоки меньшего размера.
Например, можно изменить определение типа Field на вот такое:
Код:
TYPE
Row = POINTER TO ARRAY OF LONGREAL;
Field = POINTER TO ARRAY OF Row;
В этом случае код работает медленнее, но, скажем, при factor = 27 максимум потребляемой памяти гораздо ниже:
Код:
БЫЛО
factor = 27
156396648
312711376
312711376
469026104
469026104
469026104
469026104
469026104
469026104
469026104
СТАЛО
factor = 27
156875712
157114288
157089600
157130672
157130672
157147056
157147056
157163440
157163440
157179824
Да и при factor = 50 всё прекрасно работает:
Код:
factor = 50
536906872
537350616
537425560
537503992
537487608
537520376
537549656
537491096
537520376
537553144
Вложение:
XdsMemFragmFixed.zip [1.79 КБ]
Скачиваний: 363