Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Изменение размеров динамических массивов [D7, XP]


Alex_C ©   (2009-04-14 08:50:00) 

Информацию по этому вопросу изучил, но все же хотелось бы уточнить:
с целью избежания Memory leak при перераспределении памяти динамических массивов в операторе типа SetLength(Mas, Length(Mas)+1), предполагаю при каждом увеличении длинны массива увеличивать его сразу на 25%. Вопрос такой: правильно ли при этом пользоваться SetLength, или надо пользоваться GetMem-FreeMem? Массив порядка 3 -5 тыс записей.


Германн   (2009-04-15 00:44:00) [1]


> жж   (15.04.09 00:01) [5]
>
> а вообще если планируется постоянное изменение размеров,
>  лучше воспользоваться уже готовыми решениями типа TList
>

Ну это как бы две разных сущности. Массив и список. Так что насчёт лучше - это слишком сильно сказано.


MsGuns   (2009-04-15 00:07:00) [2]

Неплохо хотя бы в общих чертах освоить как в виндах происходит управление памятью. Тогда сразу подобные вопросы пропадут как класс


жж   (2009-04-15 00:01:00) [3]


> А вод нехватка памяти из-за ее фрагментации - при таком
> многократном перераспределении памяти мелкими шажками -
> запросто.


по 25 процентов то - мелкими шажками?)

а вообще если планируется постоянное изменение размеров, лучше воспользоваться уже готовыми решениями типа TList


Amoeba   (2009-04-14 11:34:00) [4]


> Сергей М. ©   (14.04.09 11:23) [3]
>
>
> > Amoeba ©   (14.04.09 11:20) [2]
>
>
> Равно как и сброс в nil необязателен, кроме особых случаев

Кто б спорил.


Сергей М.   (2009-04-14 11:23:00) [5]


> Amoeba ©   (14.04.09 11:20) [2]


Равно как и сброс в nil необязателен, кроме особых случаев


Amoeba   (2009-04-14 11:20:00) [6]


> с целью избежания Memory leak при перераспределении памяти
> динамических массивов в операторе типа SetLength(Mas, Length(Mas)+1)

Никаких утечек памяти быть не может и не будет.

А вод нехватка памяти из-за ее фрагментации - при таком многократном перераспределении памяти мелкими шажками - запросто.
По сему рекомендую использовать FastMM, что позволит избежать таких неприятностей. Кстати, он позволяет вылавливать утечки памяти. Подробности в документации.
http://sourceforge.net/projects/fastmm/
FastMM is a lightning fast replacement memory manager for Borland Delphi Win32 applications that scales well in multi-threaded applications, is not prone to memory fragmentation, and supports shared memory without the use of external .DLL files.

>
> Сергей М. ©   (14.04.09 09:14) [1]
>
> GetMem/FreeMem неприменимы для дин.массивов.
> Только SetLength и finalize.

Finalize вовсе необязательно, кроме особых случаев достаточно приравнять к nil.


Сергей М.   (2009-04-14 09:14:00) [7]

GetMem/FreeMem неприменимы для дин.массивов.
Только SetLength и finalize.


Наверх

Титульная страница Поиск, карта сайта Написать письмо