Dnes jen krátce a ke konkrétnímu tématu. Jak známo, velké objekty GC na haldě nepřesouvá, takže pokud si je budete alokovat a uvolňovat sami, nezpůsobíte svým počínáním větší fragmentaci než GC. Právě velké objekty je vhodné uvolnit co nejdříve a pokud možno deterministicky. To není v .NET problém, na neřízené haldě lze alokovat třeba i sto MB a díky IDisposable paměť uvolnit, jakmile objekt nepotřebujeme. Můžeme mít tedy ve třídě nějaký pointer:
private: Neco* ptr;
Ten alokujeme v konstruktoru a uvolňujeme v destruktoru, tedy Dispose:
~Trida() { delete ptr; ptr = nullptr; }
Potíže nastanou, pokud nedisciplinovaný programátor objekt explicitně nezruší. Na první pohled vhodné řešení s finalizérem může být fatální:
!Trida() { delete ptr; }
Tím sice teoreticky zamezíme únikům paměti, jenže GC na neřízenou haldu zvysoka, ehm, kašle, takže dříve než úklidu se dočkáte výjimky OutOfMemoryException. Mnohem lepší je vyhodit ve finalizéru výjimku:
!Trida() { throw gcnew Exception("Object not disposed properly"); }
Nezlikvidovat náležitě objekt je pochopitelně chyba programátora, ale pořád se najdou jedinci, kteří nečtou dokumentaci, případně v životě neslyšeli o using, takže naservírováním výjimky, která s přehledem odstřelí celou aplikaci, jim vlastně děláte laskavost.
Tohle je takove ucitelske reseni :-) Samozrejme ze programator (serverovych) aplikaci nic netusici o IDisposable a using je pohroma (ono ale kdo se dnes zabyva takovymi "detaily", ze :-/ )
Problemem je, ze neni moc nastroju, ktere dokazi zapomenute volani Dispose rozumne diagnostikovat. Tim spise, kdyz .NET Compact Framework (jehoz slava uz se hvezd nedotyka) takovou diagnostiku poskytuje http://blogs.msdn.com/b/netcfteam/archive/2006/12/18/netcf-3.5_2700_s-finalizer-log.aspx
@7 Na druhou stranu .NET by mohl spouštět GC, než dojde k OutOfMemoryException. Navíc finalizéry obecně by se neměly používat, jejich provedení není garantováno (a např. Java je taky v některých případech nevolá), i když v .NETu se kupodivu volají i těsně před ukončením aplikace.
@8 Pak je otazka, zda-li nevyuzit spise CER http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=86c71425-57bc-4fcb-b34b-3262812f12cf
Autor se zabývá vývojem kompilátorů a knihoven pro objektově-orientované programovací jazyky.
Přečteno 36 200×
Přečteno 25 361×
Přečteno 23 795×
Přečteno 20 177×
Přečteno 17 874×