Loading...
Valleri avatar Valleri 304 Точки

Защо зачистваме ресурси преди да излезем от main() ?

Забелязах, че викаме функции от SDL, който Quit-ват библиотеки, като TTF или IMAGE или MIX, или зачистваме Window и други обекти.
Когато програмата излезе, това не се ли случва така или иначе понеже операционната система зачиства паметта ползвана от процеса.
Ако не се лъжа дори и файл да отвориш и да забравиш да го затвориш, ако програмата излезе, той ще си се "освободи" за да бъде ползван от други програми.

Мисля, че тези функции съществуват, за да можеш динамично, по време на приложението ти да спираш и пускаш дадени модули или прозорци, surface-и за да не се трупа излишна памет.

Тагове:
2
C++ Applications Development
j.petrov_90 avatar j.petrov_90 373 Точки

Привет, Валери,

Благодаря ти за хубавия въпрос. Всичко, което си поставил като хипотези е правилно.
Ще ти отговоря първо кратко и хумористично след това ще дам повече аргументация.

Защо зачистваме ресурси преди да излезем от main() ?
Краткият отговор - защото така се прави.

Хумористичната аналогия с реалния свят е следната:
Отиваш да хапнеш нещо на бързо в мола. Взимаш си хамбургер и една кола в таблата, сядаш някъде и се храниш.
След като приключиш имаш 2 варианта:
- да си изхвърлиш сам отпадъците в най-близкото кошче
- да ги оставиш на масата и да си тръгнеш, знаейки, че някой служител на търговския обект ще ги изчисти след теб
И двата отговора са "технически" правилни. Отпадъците ще се озоват в кошчето. Аз обаче смятам, че първият вариан е за предпочитане.

Дългият отговор - защото така се прави.
Вече не пишем задачи от по 2 файла, които имат за цел да напечатат нещо на конзолата.
Вече градим цялостен проект, където се залагат добри практики от ред 1.
На теория в момента няма нужда да затваряме SDL библиотеките, защото ОС-а така или иначе ще го направи.
Важно е обаче ти винаги да зачистваш ресурсите си (било то памет, библиотеки или файлови дескриптори).

Ще попиташ защо?
Има много на брой  "вярни" отговори:

1) След всяко изминало занятие - ще добавяме нов код, нови функционалности и нови знания.
3 седмици по-късно в проекта, изведнъж сега трябва да се сетим - "ааа, ама сега трябва да се върнем и да затворим SDL, да зачистим онази памет и т.н."
Гаранция ти давам, че не всички (в това число и аз) биха се сетили да зачистят всеки един ресурс, който сме оставили "отворен".

2) Факта, че в момента пишем binary (или .exe) не значи, че по вкяко едно време от разработката на нашето приложение то не може да бъде сменено на библиотека (статична или динамична).
Тогава, нашите функционалности вече няма да имат main() и ОС, който да им зачиства ресурсите.
Ползвателят на нашата библиотека ще предполага, че нашата библиотека сама се грижи за ресурсите си, а не ги leak-ва.

3) Дори и да не правехме библиотека - разработката на нашето приложение ще се разрастне.
Ще започнем да зареждаме повече и "по-тежки" ресурси.
В този сценарий още в run-time ще ни се налага да освобождаваме ресурсите, които вече не използваме.

Аналогията е същата, ако отвориш 50GB 4k филм.
Какво ще се случи? Ще се заредят ли 50GB в RAM паметта ти?
Не. Филма ще се стриймва на части. Т.е. ще зарежда и отзарежда динамични ресурси on the fly.

Мога да пиша още, но смятам да спра да тук.
Поздрави

3
14/10/2021 10:57:58
MartinBG avatar MartinBG 4803 Точки

Към причините, написани от @j.petrov_90, ще добавя и още една.

Ако не освобождаваме ресурсите преди края на програмата, тулове като Valgrind ще ги отчетат като лийкнати, а това ще затрудни идентифицирането на "неочаквани" лийкове в лога.

3
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.