2011-01-18 10 views
12

Analizując stosy pamięci po 4 typów GC uchwyty na ogół natknąć:Co to jest pojęcie "Uchwyt" GC "?

  1. słabych: - obserwuje się słabe uchwyt GC nie będą zapobiegać rzędzie odpowiada przed zbierane śmieci. Example, used by the System.WeakReference class instances.

  2. Normalny: - Normalny uchwyt GC zapobiega zbieraniu śmieci z odpowiedniej instancji. Example, used by the instances of strong references.

  3. RefCounted: - uchwyt odniesienia liczone GC jest używane wewnętrznie przez program, example, when dealing with COM interfaces.

  4. podpięty: - Dlaczego potrzebujemy tego rodzaju GC obsłużyć? Czy to tylko dla uniknięcia ruch tej instancji w pamięci lub is there any other notion behind this? I want to know the notion behind Pinned GC handle(with an example).

Edited dla Itay za odpowiedź: - Mam zakaz pusty array- DiffCell [] [] który jest związany do siatki danych w WPF. Podczas zamykania okna, w którym siatka ta danych jest obecny, na sterty widzę Przypięty GC uchwyt wskazując pustego DiffCell Tablica przez Przedmiotem [] (patrz zdjęcie). I am not using any unsafe code. I am just setting ItemsSource of data grid to null before closing that window. So my question is who does pin this array on heap and why?

alt text

Odpowiedz

7

Musimy to w przypadku używamy wskaźników.
Wyobraź sobie, że zgłaszasz wskaźnik do lokalizacji w pamięci i nie przypinasz go.
GC czasami przenosi porcje pamięci do innych miejsc, aby wskaźnik stał się nieprawidłowy.

na przykład:

public unsafe void DoSomething(byte b) 
{ 
    byte * bp = &b; 
} 

nie będzie to skompilować, ponieważ nie rozwiąże lokalizację pamięci, która przechowuje bajt.
Aby go przypiąć można użyć:

public unsafe void DoSomething(byte b) 
{ 
    fixed(byte * bp = &b) 
    { 
     //do something 
    } 
} 
+0

Dzięki Itay! Zobacz edytowane pytanie i daj mi znać o komentarzach na ten temat. –

+0

Nie bardzo wiem, jak działa WPF i wiążąca praca, więc obawiam się, że nie mogę ci tu pomóc. –

3

Nie zapomnij GCHandle który wspiera przypinania przedmiotów (i pobieranie adresu jako IntPtr). Przypinanie obiektów nie dotyczy wyłącznie kodu niebezpiecznego (instrukcja stała).