Професионална програма
Loading...
+ Нов въпрос
Valleri avatar Valleri 294 Точки

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

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

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

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

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

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

Защо зачистваме ресурси преди да излезем от 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 3904 Точки

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

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

3