Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.09.28;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.023 c
15-1208159604
Костик
2008-04-14 11:53
2008.09.28
.net или нет?


2-1219139868
pushkin42
2008-08-19 13:57
2008.09.28
Ошибка при выполнении запроса SQL


8-1181745595
ImageMaker
2007-06-13 18:39
2008.09.28
Уменьшение размеров картинки без потери качества


2-1218774438
Lamer666
2008-08-15 08:27
2008.09.28
Как получить дату и время с time.windows.com?


15-1216900159
keymaster
2008-07-24 15:49
2008.09.28
Кто работал с Castalia?