Diskuze: Správa pamäte - C++
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 5 zpráv z 5.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Princip je z teoretického pohledu jednoduchý. Na každou manuálně provedenou alokaci (malloc, calloc, new, new[]) bys měl explicitně provést dealokaci (free, delete, delete[]).
Explicitní alokaci/dealokaci se můžeš vyhnout použitím chytrých ukazatelů (std::shared_ptr<T>, std::unique_ptr<T>), ale ty neřeší vše.
Samozřejmě existují i jiné varianty, ale tyto dvě bych doporučoval aplikovat (a kombinovat), protože vždy vidíš, co se děje.
Co se týče detekce, tak třeba tady (ale to je spíš pro C, pro C++ bude
fungovat taky, ale méně efektivně, řekl bych):
https://msdn.microsoft.com/…98tx3cf.aspx
Pro C++ potřebuješ přetížit operátory new a delete (všechny jejich varianty, které používáš, popř. které používá kód, který typ oužíváš). Při každé alokaci si poznamenáš, co kde a kolik se alokovalo, a dealokace páruješ s těmito informacemi. Informace o alokacích, které ti zbudou, jsou memory leaky.
Tento test na memory leaky se často provádí během ukončování programu, nebo v nějakém důelžitém místě, kde víš, že např. všechna paměť alokovaná v předchozí fázi výpočtu by již měla být uvolněna. Musíš si ale sám vybrat místo, kde budeš memory leaky detekovat.
Co se týče přetečení/podtečení bufferu, to se často řeší tak, že na konec a začátek takového bufferu umístíš speciální obsah, který při různých příležitostech kontroluješ. Když jej někdo změní, je jasné, že zapsal do paměti, která mu nepatří. Takováto úprava znamená ale napsání vlastního alokátoru (popř. využití nějakého, který již toto umí, i třeba Windowsí halda toto nějakým způsobem umí).
Ale i když detekuješ memory leaky, neznamená to konec práce. Musíš přijít na to, proč k nim došlo (což nemusí být vůbec jednoduché, i když v případě tvé semestrálky asi bude). A příčinu ti žádný nástroj neodhalí.
Mně se osvědčilo psát kód tak, že kdykoliv napíšu nějakou alokaci, hned k ní na příslušné místo udělám dealokaci... a až pak programuji dál. Pak se memory leakům z velké části vyhneš.
Užitečná je také spolupráce třeba s valgrind, který ti alespoň přibližně napíše, kde k leakům došlo.
Případně pro Windows by se mohlo hodit něco z nástrojů diskutovaných
zde
http://stackoverflow.com/…-for-windows
Mám valgrind i na Windows v subsystému. Sice jsem to musel zkompilovat ručně, ale funguje parádně.
Zobrazeno 5 zpráv z 5.