NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Lukáš
Člen
Avatar
Lukáš :14.5.2017 1:42

Dobrý deň,
pracujem na semestrálnej práci ktorú potrebujem dnes do polnoci odoslať, nesmiem tam ale mať žiadne memory leaky čiže nesmie mi nikde pretekať pamäť .Bol by tu niekto ochotný dnes asi tak na 15 až 30 minút dať skype hovor kde ukážem svoj kód a žeby ste mi vysvetlili ako to správne zmazať aby mi ostali dáta a nenastalo pretekanie pamäte. Bol by som veľmi vďačný. Potrebujem tomu hlavne pochopiť ako sa to správa aby som to dokázal správne mazať. Ak by sa niekto našiel napíšte k tejto diskusii alebo súkromnú správu na itNetwork.

 
Odpovědět
14.5.2017 1:42
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Lukáš
Martin Dráb:14.5.2017 12:53

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š.

Nahoru Odpovědět
14.5.2017 12:53
2 + 2 = 5 for extremely large values of 2
Avatar
Honza Bittner
Tvůrce
Avatar
Honza Bittner:14.5.2017 13:31

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.

Editováno 14.5.2017 13:31
Nahoru Odpovědět
14.5.2017 13:31
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Honza Bittner
Martin Dráb:14.5.2017 20:52

Případně pro Windows by se mohlo hodit něco z nástrojů diskutovaných zde
http://stackoverflow.com/…-for-windows

Nahoru Odpovědět
14.5.2017 20:52
2 + 2 = 5 for extremely large values of 2
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Martin Dráb
Honza Bittner:14.5.2017 21:09

Mám valgrind i na Windows v subsystému. Sice jsem to musel zkompilovat ručně, ale funguje parádně.

Nahoru Odpovědět
14.5.2017 21:09
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.