
[C++] Uvolňovanie pamäte
Začal som sa učiť C++ (obyčajné Win32 aplikácie bez gc)
vytvorím objekt na halde...
auto objekt = new Trieda();
Neuvolním pamäť (pomocou delete) aplikácia sa ukončí a nikde žiadna chyba. Správa sa to ako s gc, ale neni tam gc.
Kedysi dávno som programoval v Pascale aj Delphi bez gc a pamatám si ako keď som neuvolnil pamať pomocou Free() program vyhadzoval chyby. V C++ je to inak? Poprosil by som aj odkaz na nejaký článok kde je podrobne rozobraté ako funguje správa pamäti v C++.
prekladac C++ neni manzelka ani svokra (na rozdiel od inych prekladacov) a teda sa ti do toho nestara.
Ked to rezervujes cez new, a neuvolnis, tak pamat zostane alokovana. Az zavolas tu funkciu milionkrat tak ti dojde volna RAM. (//edit: a to vobec neni vec zla, jak si mylne vela ludi mysli, ptz takto mozem predavat pointre a viem ze mi to nejaky pakovsky automaticky collector neodstreli. Len clovek musi mysliet aj na uvolnovanie).
Po ukonceni vsetkych instancii aplikacie uvolni Windows (resp. OS) vsetku RAM ktoru mala aplikacia pridelenu, takze po zavreti aplikacie tu chybu uz nevidno.
Ked to nepotrebujes rezervovat dynamicky a chces aby objekt platil len v ramci tej jednej funkcie, tak nepouzivaj new, ale deklaruj objekt ako normalne lokalnu premennu, potom po ukonceni funkcie objekt zmizne.
1. Vdaka a nevadi ked v tele triedy pouzijem this so sipkou trebars "this->premnena" a potom objekt vytvorim na zasobniku?
2. este mam otazku ked vlozim funkciu priamo do tela triedy, tak sa prelozi ako inline funkcia? nieco sa mi mari ze to tak platilo, ale nie som si isty.
1. ano aj na zasobniku ma ten objekt pointer (//edit: ale celkom nechapem naco potrebujes this, v ramci triedy automaticky ides na memberov nemusis tam pisat this->. this treba len v specialnych pripadoch)
2. tak toto neviem, vseobecne ale ak mas zapnute vsetky optimalizacie compilera (/Oneco apod) co je default pre release, tak robi compiler automaticky inline tam kde je to vhodne. Ak chces vynutit inline mozes pouzit klucove slovo inline tusim. Ale nechapem celkom naco potrebujes inline, to sa snazis robit nieco super-optimalizovane na speed? To by som potom robil radsej v cistom C.
This sa mi obcas zide ked ma napriklad clenska premmna rovnaky nazov ako lokalna premmna.
no hej, aj ked tomu by som sa radsej vyhybal (=bordel :D) Ale ok. mozes to pouzit aj ked je objekt na zasobniku.
Mmmmmm.
Ukazatel this ukazuje na proměnnou v rámci třídy.
Například:
Co se týče druhého dotazu, tak to samozřejmě záleží na překladači.
A překladači je úplně jedno jestli funkci deklaruješ a definuješ přímo ve třídě nebo mimo.
Jedná se jen o estetickou záležitost (přehlednost).
To zda funkce bude v programu inline určuje právě klíčové slovo inline před funkcí.
např.:
Zdraví SL
Vďaka za objasnenie.
No. Psal jsem to přímo z hlavy a chybička se vloudila.
Předchozí příklad vypíše 77 (tedy vždy lokální proměnnou ve třídě)
Zkoušel jsem to na Microsofťáckém překladači.
Globální proměnnou ve třídě je asi dobré vždy rozlišit jmenným rozsahem :: tyto dvě tečky.
Tady je úplný příklad na kterém jsem si to otestoval:
A mm má pravdu v tom, že ve třídě je zbytečné psát ukazatel this (nemusí to být v tom kódu).