![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно ли делать такие вызовы перед выходом из программы?
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) ?
да
> память, занимаемая данными, на которые ссылаются указатели,
> сама освобождается при завершении процесса?
да