Podoski Peter wrote:
Sejtettem, hogy ezt az aspektust valaki meg fogja említeni. Nos, pont a szemétgyűjtő algoritmus működése okozza azt a problémát, amelyet fel kellene deríteni. A szó klasszikus értelmében nem, valójában viszont mégis szivárog a memória az alkalmazásból. (Megvannak a blokkok, meg is találná őket a .NET, ha elkezdené őket keresni, csak éppen elfogynak a window handle-ek az operációs rendszeren, mivel többek között az TableLayoutPanel.Controls.Clear() hívás ugyan eltávolítja a referenciákat adott objektumra, viszont idézet a hozzá kapcsolódó dokumentációbólSzia Hijaszu! Érdekes felvetés, de tudomásom szerint menedzselt memóriakezelésű környezetben ilyen alacsony szintű felügyelést nem lehet csinálni. Amikor C++-ban egy auto_ptr-rel burkolt hivatkozás kikerül a scope-ból, akkor determinisztikusan meghívódik a burkoló destruktora, vagyis le tudod kezelni ezt az eseményt. A Garbage Collector ugye ezzel szemben indeterminisztikusra van tervezve, pont azért, mert ha nem indokolt, akkor nem törődik a memória felszabadításával. (a számítási teljesítmény javítása miatt)
(http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection.clear.aspx): " *Important Note:*Calling the Clear method does not remove control handles from memory. You must explicitly call the Dispose <http://msdn.microsoft.com/en-us/library/system.windows.forms.control.dispose.aspx> method to avoid memory leaks.
"Azaz, nekem kifejezetten meg kell hívnom az összes benne lévő objektumra a Dispose-t ilyenkor. Ez nagyjából el is fogadható lenne, ha nem lenne a fenti általános tévképzet, hogy majd a keretrendszer megoldja. Ennek köszönhetően, ezt senki sem tette meg a programunkban, és most fel kellene deríteni a hibát, hogy hol szivárog a memória. Igen ám, csak mivel a szó klasszikus értelmében nem szivárog (tekintve, hogy a Garbage Collection megtalálná, ha akarná, csak valahogy a belső rendszer továbbra is referál rá azért mert volt Dispose), nem tudom megtalálni azokat az objektumokat, amelyeket már fel kellett volna szabítani. (Profiler eszközzel sem, mert csak azt látom, hogy gyűlik a memória blokk, azt nem tudom megjelölni, hogy melyek azok amelyeknek már nem kéne ott lenni.)
A kérdés azért merült fel bennem, mert valahogyan meg kellene jelölnöm, hogy ki az az objektum, aki már illegálisan tartózkodik a memóriában. (És ugye Porkoláb Tanár Úrtól tudjuk, hogy ZH alatt így lehet a diákon számon kérni a megfelelő mennyiségű memória felszabadítást:)
A fenti miatt automatikus megoldás kellene találni, mert egy már létező kódot nem lehet egy "írjuk át mindenhol" módon javítani (mivan, ha nem sikerül mindenhol rendesen átírni stb...).Az én ötletem az lett volna, hogy elindulok az IDisposable interfész irányába, és a Dispose() metódusba valamilyen globális osztálynak szólok, hogy az objektum felszabadította magát. Csakhogy ez nem referenciaszámlálás, hanem explicit fel- és leregisztráció valami központi nyilvántartásba, acélod pedig nem ez volt, ez így túl "bürokratikus". :)
Ez nem lenne probléma jelen esetben, mert így sem gereblyézi össze a GC őket, ez a probléma :D. (Ennyit arról, hogy majd a nyelv valamit megcsinál a programozó helyett.)Jóllehet C#-ban is meg tudsz adni destruktort (vagy akár Finalize()-ot), de amennyiben egy központi (statikus) helyen mindig ott csücsül egy referencia a számlált objektumra, azt sohasem fogja összegereblyézni a GC.
Ha magasabb szinten képzelted a dolgot, akkor viszont ajánlható egy design pattern a problémára. Mert ha pl. az asztali alkalmazás User Interface-én keresztül globálisan értesülni akarsz különféle modellbeli eseményekről, akkor az MVC/P architekturális tervminta felhasználható ilyen célra. Szabad megtudni, milyen megfontolásból akarsz saját referencia számlálót írni?
Lásd a problémát fenn.
pody -----Original Message----- From: eaf-bounce@xxxxxxxxxxxxx [mailto:eaf-bounce@xxxxxxxxxxxxx] On Behalf Of Zimler Attila Tamas Sent: Wednesday, May 07, 2008 9:32 PM To: eaf@xxxxxxxxxxxxx Subject: [eaf] Referencia számlálás Sziasztok, Van valakinek ötlete hogyan lehetne implementálni referencia számlálást C# nyelven? :) Hasonlóra gondolok, mint a C++-ban az auto_ptr :) H. -- Az eletben vannak szabalyok Nehanyat meg lehet kerulni, a tobbit pedig meg lehet szegni (The Matrix)
-- Az eletben vannak szabalyok Nehanyat meg lehet kerulni, a tobbit pedig meg lehet szegni (The Matrix) -----BEGIN PGP PUBLIC KEY BLOCK----- Version: OpenKeyServer v1.2 Comment: Extracted from belgium.keyserver.net mQGiBEE/HTYRBACInacMGc8B/lkX3CXh5D9wUDlmza4hoatNZjJmWNnPWC9c0h2V Pi9zYJ1bVqeUnNDzCRpovPdwrswWvb9WpVOS0A7TafzWxCYud6gN8g5KiC7cSuJV cxI0uv3jWSjUkLnECqTpm9piM4WptXrdFLxUyrKPu+Nl82QSjfdbB+8xXwCg+rWO KeOZZGGGIYWu+rZ0M/MqyCUD/jqQVc7alF8+5y//zNDml3THTc3ljK8CLcHxFv6F uADmvHSePRTR1ACBV3dTxL8awvanRsXC25LOuYgM1hF9RRwof59xNtXVttvo724b FDR+oRDVKyoEm6Istfn9xbbNqRqPfk83SHvect/hlHsfgaTBKd+IRAEkbMIdRin/ E45fA/0bzklqLGj4a8qSxMMvZ1Ib+2RmH5I6o9o33FY3Nmc7IEXJizyTyQaASYCx ldjuRmfWSOP3gQRrH5owuZq5KBCC/PNMNnUsA4noFmvIilA/9UYqMtQ0BNr+miIM 9/LV70ZbBHVpDLjb2baMjbKrmCFf9rjlc17fFsWk5ZJuE3/UxLQrWmltbGVyIEF0 dGlsYSBUYW3DoXMgPGhpamFzenVAaGxmc2xpbnV4Lmh1PohXBBMRAgAXBQJBPx02 BQsHCgMEAxUDAgMWAgECF4AACgkQ+3OFVYni0PSysACffD6VDtoer3aBe8Gpvn8e gwiNNH8AmwcmBIrZeCOeobIuZZp3CCOgQblIuQENBEE/HTkQBACKNzv7gS0fgeiO AMoss2bbO7X9GuO3ufc3+zx2yGV7SvYAuyWLOSMhs1ZYBVp6IawDY88zEx81oxRj Jd4zO8h/3BI9cmjZ4NAmdv7lWjTs0I0ijFnemcFQaffxN8vIB9DqA4oyJ0A/bS7J 0E/i13sr7hRgB6NZbpy4PSSkczggvwADBQP8D3eakqeJHf1yLmw1XmQVDxHLxtrI VL0TShFEfMGU/MLfKpcmrd43EsSondsNNm8jv4b9Y/Wgc8XPQQrfPodC5mKt8mQC F/ovWBFs46YvhS5pojQmp6i9octTWw2OqVn3QgrBFqm4QvayLE9wRLm/xgaFApVI 4RiOOEA6SidURGCIRgQYEQIABgUCQT8dOQAKCRD7c4VVieLQ9HoZAJ4xR5Y1qlnC LTn1GkbEW0Va+72EqwCfQTP37ylZGrvpYnFoewBIMuLFHM8= =K0/l -----END PGP PUBLIC KEY BLOCK-----