Wyciek pamięci

0

Wyobraźmy sobie że jest jakieś okno dialogowe w trakcie działania programu. Labelki, buttony itd. Chcę żeby po jego zamknięciu na wszystkich jego obiektach(jest wiele paneli, w których są panele, i w kórych labelki itd wiele rzeczy jedna w jednej) wykonana była funkcja dispose(). Obiekty te zdeklarowane mam globalnie bo tak potrzebuje. Zauważyłem że GC nie oczyszcza mi tych obiektów po zamknięciu okna dialogowego (ilośc pamięci wzrasta po każdym uruchomieniu). Uruchomienie GC.Collect() też niewiele zmienia. Wygląda na to że nie zwalnia mi tych obiektów bo są zadeklarowane globalnie, poza tym są do nich przypisane różne zdarzenia. Za każdym uruchomieniem tego okna mam szereg instrukcji typu Label1 = new Label(); itd - być może dlatego coraz więcej pamięci jest przydzielanej. Nie doczytałem nigdzie w artykułach o GC jak się ono zachowuje gdybyśmy np. wielokrotni powtarzali właśnie takie coś Label1 = new Label(); ale z tego wynika, że występuje wtedy wyciek pamięci. Co najlepiej zrobić w tym przypadku jeżeli w tym oknie dialogowym jest bardzo wiele kontrolek jedna w drugiej i chce je przy ponownym otwarciu okna wyczyścić przed kolejnym utworzeniem aby nie powiększać sterty.

0

Utworzyć obiekt tego okna i przy zamykaniu pozbyć się wszystkich referencji do niego. Zalecam też jeśli to nie zadziała użyć funkcji, która skasuje wszystkie zdarzenia. Gdy .NET nie będzie miał możliwości dostania się do obiektu, to wtedy go usunie.

0

Jak zrobić jedno a jak drugie ? W szczególności jak rozłączyć wcześniej przypisane zdarzenie (używałem eventów tych systemowych jak i następującej konstrukcji
ToolStripIBP2Wylacz.Click += delegate(object x, EventArgs y) { ObslugaMenu(145, 0, i); };
gdzie obsluga menu bylo funkcją wykonującą różne czynności w zależności od przycisku który ją wywołał.
Jak teraz rozłączyć te zdarzenia ?

0

przypisz im nil
//quetz: null

1 użytkowników online, w tym zalogowanych: 0, gości: 1