OberonCore
https://forum.oberoncore.ru/

XDS: Утечка памяти при размещении массива
https://forum.oberoncore.ru/viewtopic.php?f=30&t=4343
Страница 1 из 1

Автор:  GameHunter [ Понедельник, 06 Май, 2013 14:02 ]
Заголовок сообщения:  XDS: Утечка памяти при размещении массива

В программе (см. attachment) ARRAY OF ARRAY OF LONGREAL размещается
в куче несколько раз. Это приводит к утечке памяти. Размер массива довольно большой.

Вложения:
Bug.rar [6.37 КБ]
Скачиваний: 370

Автор:  Александр Ильин [ Понедельник, 06 Май, 2013 15:57 ]
Заголовок сообщения:  Re: XDS: Утечка памяти при размещении массива

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 КБ]
Скачиваний: 365

Автор:  GameHunter [ Понедельник, 06 Май, 2013 16:44 ]
Заголовок сообщения:  Re: XDS: Утечка памяти при размещении массива

Какая же это фрагментация, если одномоментно существует только один указатель на массив, а объём используемой памяти постоянно растёт?
Именно утечка...

Страница 1 из 1 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/