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

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

Нужно ли делать такие вызовы перед выходом из программы?


AlexanderMS ©   (2008-08-19 13:20:00) 

1) Скажите, пожалуйста, нужно ли перед выходом из программы, для освобождения занятой памяти, делать такие вызовы:
SetLength(SomeDynArray, 0);
MyStringList.Free;
?
Или память, занимаемая данными, на которые ссылаются указатели, сама освобождается при завершении процесса?

2) Аналогично: закрывать ли дескрипторы, например:
CloseHandle(FileHandle)?

3)И ещё: при использовании OpenGL нужно ли вызывать перед выходом glDeleteTextures, glDeleteListsи т. п? Или при выгрузке экземпляра библиотеки она это сделает за нас?

Заранее спасибо.


Loginov Dmitry   (2008-08-19 23:49:00) [1]

> 1) Скажите, пожалуйста, нужно ли перед выходом из программы,
> для освобождения занятой памяти, делать такие вызовы:
> SetLength(SomeDynArray, 0);
> MyStringList.Free;
> ?
> Или память, занимаемая данными, на которые ссылаются указатели,
> сама освобождается при завершении процесса?
>
> 2) Аналогично: закрывать ли дескрипторы, например:
> CloseHandle(FileHandle) ?


Само собой винда все подчистит, заморачиваться на такие мелочи - смысла особого нет. Однако если пишешь модуль (PAS-файл), который может использоваться не только в EXE, но и в DLL, то здесь такое может не прокатить. Во-первых ресурсы после FreeLibrary() не освободятся, во-вторых у объекта, созданного в DLL может быть Owner из EXE, и тогда будет AV на методе Free у Owner'a.

P.S. Код SetLength(SomeDynArray, 0)лишен всякого смысла, т.к. все динамические объекты при выходе освобождаются автоматически (если не ошибаюсь, это происходит в момент finalization модуля, в котором динамический объект объявлен).


Игорь Шевченко   (2008-08-19 15:59:00) [2]

DVM ©   (19.08.08 15:37) [13]


> Ресурсы GDI.


Это немного другая проблема - при массовых утечках там внутре что-то начинает ломаться. И завершение работы даже всех программ тут не спасает. Собственно, если запустить несколько программ, активно жрущих ресурсы GDI, даже несмотря на отсутствие в них утечек картина будет аналогичная.


DVM   (2008-08-19 15:37:00) [3]


> Например ?

Ресурсы GDI. Многократно наблюдал следующую картину, при аварийном завершении программы, содержащей массовые утечки ресурсов GDI, потом в во всех остальных окнах наблюдались проблемы с иконками, битмапами и т.д.


Игорь Шевченко   (2008-08-19 15:35:00) [4]

DVM ©   (19.08.08 15:32) [11]


> не все там возвращается системе автоматически после завершения
> процесса.


Например ?


DVM   (2008-08-19 15:32:00) [5]


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

в Win9x чревато нестабильным поведением ОС, не все там возвращается системе автоматически после завершения процесса.


Игорь Шевченко   (2008-08-19 15:30:00) [6]

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


Vlad Oshin   (2008-08-19 15:29:00) [7]


> Система стала забирать память за программой
>
>
> Это как ?

не знаю.
.. как она ее назад в свой менеджер забирает?


> А как узнать, если они появятся? И как искать утечки?

поставить какой либо менеджер.
FastMM4, например, постоянно кричит, если что-то забыл освободить


DVM   (2008-08-19 15:28:00) [8]


> А как узнать, если они появятся? И как искать утечки?

Подключить FastMM4 или MemProof использовать. В D2006 и выше можно первой строкой проекта указать ReportMemoryLeaksOnShutdown := true;


AlexanderMS   (2008-08-19 15:26:00) [9]

Спасибо за ответы.


> а во-вторых, все это тогда не будет мешать искать утечки
> в других местах работы программы, если они вдруг появятся.
>

А как узнать, если они появятся? И как искать утечки?


Сергей М.   (2008-08-19 15:22:00) [10]


> Система стала забирать память за программой


Это как ?


clickmaker   (2008-08-19 15:06:00) [11]

> [4] Vlad Oshin ©   (19.08.08 14:04)

не думаю, что менеджер памяти настолько туп. Блок памяти, помеченный как в процессе на запись, не должен быть запорчен. Тем более, что есть системный кэш и кэш контроллера винта


Vlad Oshin   (2008-08-19 14:04:00) [12]

у меня такой вопрос:
Может ли так случится, что программа попросила записать на диск, потом сделал halt
Система стала забирать память за программой, испортила очередь на запись, потом файл дозаписала, потом закрыла.


DVM   (2008-08-19 13:48:00) [13]


> AlexanderMS ©   (19.08.08 13:20)

Несмотря на [2], лучше все же это делать самому. Ибо, во-первых, это правило хорошего тона, а во-вторых, все это тогда не будет мешать искать утечки в других местах работы программы, если они вдруг появятся.


Игорь Шевченко   (2008-08-19 13:27:00) [14]

Вся память освобождается при завершении процесса
Все открытые файлы и прочие объекты закрываются при завершении процесса.


Vlad Oshin   (2008-08-19 13:24:00) [15]


> 1) Скажите, пожалуйста, нужно ли перед выходом из программы,
>  для освобождения занятой памяти, делать такие вызовы:
> SetLength(SomeDynArray, 0);
> MyStringList.Free;
>
> 2) Аналогично: закрывать ли дескрипторы, например:
> CloseHandle(FileHandle) ?

да


> память, занимаемая данными, на которые ссылаются указатели,
>  сама освобождается при завершении процесса?

да


Наверх

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