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.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.