Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
Вниз
Нужно ли делать такие вызовы перед выходом из программы? Найти похожие ветки
← →
AlexanderMS © (2008-08-19 13:20) [0]1) Скажите, пожалуйста, нужно ли перед выходом из программы, для освобождения занятой памяти, делать такие вызовы:
SetLength(SomeDynArray, 0);
MyStringList.Free;
?
Или память, занимаемая данными, на которые ссылаются указатели, сама освобождается при завершении процесса?
2) Аналогично: закрывать ли дескрипторы, например:CloseHandle(FileHandle)
?
3)И ещё: при использовании OpenGL нужно ли вызывать перед выходомglDeleteTextures
,glDeleteLists
и т. п? Или при выгрузке экземпляра библиотеки она это сделает за нас?
Заранее спасибо.
← →
Vlad Oshin © (2008-08-19 13:24) [1]
> 1) Скажите, пожалуйста, нужно ли перед выходом из программы,
> для освобождения занятой памяти, делать такие вызовы:
> SetLength(SomeDynArray, 0);
> MyStringList.Free;
>
> 2) Аналогично: закрывать ли дескрипторы, например:
> CloseHandle(FileHandle) ?
да
> память, занимаемая данными, на которые ссылаются указатели,
> сама освобождается при завершении процесса?
да
← →
Игорь Шевченко © (2008-08-19 13:27) [2]Вся память освобождается при завершении процесса
Все открытые файлы и прочие объекты закрываются при завершении процесса.
← →
DVM © (2008-08-19 13:48) [3]
> AlexanderMS © (19.08.08 13:20)
Несмотря на [2], лучше все же это делать самому. Ибо, во-первых, это правило хорошего тона, а во-вторых, все это тогда не будет мешать искать утечки в других местах работы программы, если они вдруг появятся.
← →
Vlad Oshin © (2008-08-19 14:04) [4]у меня такой вопрос:
Может ли так случится, что программа попросила записать на диск, потом сделал halt
Система стала забирать память за программой, испортила очередь на запись, потом файл дозаписала, потом закрыла.
← →
clickmaker © (2008-08-19 15:06) [5]> [4] Vlad Oshin © (19.08.08 14:04)
не думаю, что менеджер памяти настолько туп. Блок памяти, помеченный как в процессе на запись, не должен быть запорчен. Тем более, что есть системный кэш и кэш контроллера винта
← →
Сергей М. © (2008-08-19 15:22) [6]
> Система стала забирать память за программой
Это как ?
← →
AlexanderMS © (2008-08-19 15:26) [7]Спасибо за ответы.
> а во-вторых, все это тогда не будет мешать искать утечки
> в других местах работы программы, если они вдруг появятся.
>
А как узнать, если они появятся? И как искать утечки?
← →
DVM © (2008-08-19 15:28) [8]
> А как узнать, если они появятся? И как искать утечки?
Подключить FastMM4 или MemProof использовать. В D2006 и выше можно первой строкой проекта указать ReportMemoryLeaksOnShutdown := true;
← →
Vlad Oshin © (2008-08-19 15:29) [9]
> Система стала забирать память за программой
>
>
> Это как ?
не знаю.
.. как она ее назад в свой менеджер забирает?
> А как узнать, если они появятся? И как искать утечки?
поставить какой либо менеджер.
FastMM4, например, постоянно кричит, если что-то забыл освободить
← →
Игорь Шевченко © (2008-08-19 15:30) [10]Не знаю, кто как действует, но я не буду искать утечки в программах, время выполнения которых конечно и заведомо известно. Времени жалко, как на поиск, так и на написание кода по их, утечек, устранению.
← →
DVM © (2008-08-19 15:32) [11]
> но я не буду искать утечки в программах, время выполнения
> которых конечно и заведомо известно.
в Win9x чревато нестабильным поведением ОС, не все там возвращается системе автоматически после завершения процесса.
← →
Игорь Шевченко © (2008-08-19 15:35) [12]DVM © (19.08.08 15:32) [11]
> не все там возвращается системе автоматически после завершения
> процесса.
Например ?
← →
DVM © (2008-08-19 15:37) [13]
> Например ?
Ресурсы GDI. Многократно наблюдал следующую картину, при аварийном завершении программы, содержащей массовые утечки ресурсов GDI, потом в во всех остальных окнах наблюдались проблемы с иконками, битмапами и т.д.
← →
Игорь Шевченко © (2008-08-19 15:59) [14]DVM © (19.08.08 15:37) [13]
> Ресурсы GDI.
Это немного другая проблема - при массовых утечках там внутре что-то начинает ломаться. И завершение работы даже всех программ тут не спасает. Собственно, если запустить несколько программ, активно жрущих ресурсы GDI, даже несмотря на отсутствие в них утечек картина будет аналогичная.
← →
Loginov Dmitry © (2008-08-19 23:49) [15]> 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 модуля, в котором динамический объект объявлен).
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2008.09.28;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.053 c