Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 14. listopad 2011, 19:44:34 Předmět: Uvolnění dynamické paměti na konci kódu |
|
|
Dobrý den, chtěl bych se zeptat, jestli má cenu na konci kódu uvolnit dynamickou pamět.
kód: |
int main()
{
int *pamet=new int[1024];
delete *pamet;
return 0;
} |
Prostě jestli má uvolnění paměti na konci nějaký význam.
Předem děkuji. Tomáš |
|
Návrat nahoru |
|
 |
Marek

Založen: 28. 07. 2007 Příspěvky: 1782 Bydliště: Velká Morava
|
Zaslal: 14. listopad 2011, 19:55:38 Předmět: |
|
|
Ne. Na konci procesu se zruší i všechna jeho pamět. Ale pouze na konci procesu. Uzavřou se i otevřené soubory a uvolní se všechny zdroje, které si aplikace sama naalokovala a které nejsou sdílené s jinými procesy.
Jinak ten kód je špatně. Správně má být:
delete [] pamet;
Obecně je lepší ale vše uvolňovat, protože různé automatické detektory memory leaků pak nebudou moc užitečné, pokud neuvolňuješ paměť schválně. _________________ AMD Open Source Graphics Driver Developer |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 14. listopad 2011, 20:00:00 Předmět: |
|
|
Takže se pak třeba může stát že ukončím program a zůstane mi zaplněná paměť?
A když už jsme u té chyby, myslel jsem že [] se dá vždy nahradit *
Takže delete je vyjímka? |
|
Návrat nahoru |
|
 |
OndraSej

Založen: 28. 07. 2007 Příspěvky: 767 Bydliště: Brandýs nad Labem
|
Zaslal: 14. listopad 2011, 20:19:05 Předmět: |
|
|
Aroidzap> Jak psal Marek - pamet se na konci sice "uvolni" sama, ale je vhodne ji uvolnit rucne nejen kvuli memory leakum, ale take proto, ze se ti velice snadno muze stat, ze se z programu stane knihovna nebo ze tu cast, ktera neuvolnovala pamet budes volat behem behu programu opakovane a dodavat spravnou spravu pameti do existujiciho kodu je tezsi nez kdyz s ni pocitas dopredu.
A hlavne, s pouzitim RAII a smart pointeru z Boost (resp. z noveho standardu) se da udelat celkem jednoduse a slusne.
Rozdil mezi delete a delete[] je v tom, jak se volaji destruktory na objektech v poli. Resp. v tom, ze delete zavola destruktor jen na tom prvnim, zatimco delete[] by je melo zavolat na vsech objektech v poli.
U pole intu asi projde oboji (int nema destruktor, takze se jenom uvolni pamet), coz ale nic nemeni na tom, ze spravne ma na poli byt delete[]. Kompliator sice nenadava (casto sam nemuze behem kompilace rozeznat pole od pointeru), ale memory checkery muzou. _________________ http://trionteam.net |
|
Návrat nahoru |
|
 |
Aroidzap

Založen: 14. 11. 2011 Příspěvky: 68
|
Zaslal: 14. listopad 2011, 20:48:23 Předmět: |
|
|
Mockrat diky za vysvetleni  |
|
Návrat nahoru |
|
 |
Slappy

Založen: 31. 07. 2009 Příspěvky: 169 Bydliště: Zilina
|
Zaslal: 15. listopad 2011, 06:52:22 Předmět: |
|
|
Uvolnovat pamat na konci programu je uz neskoro!
Zakladne pravidlo [aspon ako som sa to ucil ja]: uvolnit pamat akonahle uz nie je potrebna. _________________ Skinovane instalatory pre NSIS a Inno Setup, zdarma pre SK/CZ projekty: www.graphical-installer.com |
|
Návrat nahoru |
|
 |
|