Co to jest C ++ Garbage Collection?

Odśmiecanie jest techniką zarządzania pamięcią. Jest to osobna metoda automatycznego zarządzania pamięcią stosowana w językach programowania, w których ręczne zarządzanie pamięcią nie jest preferowane ani wykonywane. W metodzie ręcznego zarządzania pamięcią użytkownik musi wspomnieć o pamięci, która jest używana i którą można zwolnić, podczas gdy śmieciarz zbiera pamięć zajmowaną przez zmienne lub obiekty, które nie są już używane w programie. Tylko pamięć będzie zarządzana przez śmieciarze, inne zasoby, takie jak destruktory, okno interakcji użytkownika lub pliki nie będą obsługiwane przez śmieciarz.

Niewiele języków potrzebuje śmieciarek jako części języka dla dobrej wydajności. Języki te nazywane są językami odśmiecania. Na przykład Java, C # i większość języków skryptowych wymaga wyrzucania elementów bezużytecznych w ramach ich działania. Podczas gdy języki takie jak C i C ++ obsługują ręczne zarządzanie pamięcią, która działa podobnie do garbage collectora. Istnieje kilka języków, które obsługują zarówno wyrzucanie elementów bezużytecznych, jak i ręcznie zarządzaną alokację / dezalokację pamięci, w takich przypadkach oddzielna sterta pamięci zostanie przydzielona do modułu wyrzucania elementów bezużytecznych i pamięci ręcznej.

Niektórym błędom można zapobiec, gdy używana jest metoda wyrzucania elementów bezużytecznych. Jak na przykład:

  • zwisający problem wskaźnika, w którym wskazana pamięć jest już zwolniona, podczas gdy wskaźnik nadal pozostaje i wskazuje inne przypisane dane lub już usuniętą pamięć
  • problem występujący, gdy próbujemy usunąć lub cofnąć przydział pamięci po raz drugi, która została już usunięta lub przeniesiona do innego obiektu
  • usuwa problemy lub usterki związane ze strukturami danych oraz efektywnie obsługuje pamięć i dane
  • można uniknąć wycieków pamięci lub wyczerpania pamięci

Zobaczmy szczegółowe rozumienie ręcznego zarządzania pamięcią a zbieranie śmieci, zalety, wady i sposób implementacji w C ++.

Ręczne zarządzanie pamięcią

Dynamicznie przydzielana pamięć w czasie wykonywania ze sterty musi zostać zwolniona, gdy przestaniemy używać tej pamięci. Dynamicznie alokowana pamięć pobiera pamięć ze sterty, która jest wolnym magazynem pamięci.

W C ++ alokacja i dezalokacja pamięci odbywa się ręcznie za pomocą poleceń takich jak new, delete. Używanie „nowej” pamięci jest przydzielane ze sterty. Po użyciu pamięć ta musi zostać wyczyszczona za pomocą polecenia „usuń”.

Każde przydzielenie pamięci za pomocą „nowego” musi być zakończone poleceniem „usuń”. Jeśli nie, zabraknie nam pamięci.

Aby pokazać to wyraźnie na przykładzie:

n = nowy przykład_obiektu;
******* wykorzystanie jest tu realizowane *******
usuń n;

Jak pokazano, każdy nowy powinien kończyć się lub przechylać poleceniem usuwania. Tutaj n wskaźnik jest przydzielany do pamięci za pomocą polecenia „new” i jest wskazywany lub wskazywany obiekt o nazwie „sample_object”. Po zakończeniu używania i działania wskaźnika, powinniśmy zwolnić lub zwolnić pamięć za pomocą polecenia „usuń”, jak opisano powyżej.

Ale w przypadku wyrzucania elementów bezużytecznych pamięć jest przydzielana za pomocą polecenia „nowy”, ale nie trzeba jej ręcznie zwalniać za pomocą polecenia „usuń”. W takich przypadkach moduł czyszczący wykonuje okresowe sprawdzanie wolnej pamięci. Kiedy jakiś element pamięci nie jest wskazywany przez żaden obiekt, usuwa on lub zwalnia pamięć, tworząc więcej wolnego miejsca na stercie.

Zalety i wady ręcznego zarządzania pamięcią

Zalety ręcznego zarządzania pamięcią polegają na tym, że użytkownik ma pełną kontrolę nad operacjami przydzielania i zwalniania, a także wie, kiedy nowa pamięć jest przydzielana, a kiedy jest zwalniana lub zwalniana. Ale w przypadku wyrzucania elementów bezużytecznych, dokładnie w tym samym momencie po użyciu pamięć nie zostanie zwolniona, zostanie zwolniona, gdy napotka ją podczas operacji okresowej.

Również w przypadku ręcznego zarządzania pamięcią, destruktor zostanie wywołany w tym samym momencie, gdy wywołamy polecenie „usuń”. Ale w przypadku śmieciarza, który nie jest zaimplementowany.

Istnieje kilka problemów związanych z korzystaniem z ręcznego zarządzania pamięcią. Czasami możemy dążyć do podwójnego usunięcia zajętej pamięci. Kiedy usuwamy już usunięty wskaźnik lub pamięć, istnieje szansa, że ​​wskaźnik może odwoływać się do niektórych innych danych i może być używany.

Innym problemem, który mamy w ręcznym zarządzaniu pamięcią, jest to, że jeśli otrzymamy wyjątek podczas wykonywania lub używania nowego wskaźnika przydzielonej pamięci, wyjdzie on z sekwencji „nowy” i „usuń”, a operacja zwolnienia nie będzie wykonane. Mogą również wystąpić problemy z wyciekiem pamięci.

Zalety i wady Garbage Collector

Jedną z głównych wad usuwania śmieci jest czas lub cykle procesora związane z odnalezieniem nieużywanej pamięci i jej usunięciem, nawet jeśli użytkownik wie, która pamięć wskaźnika może zostać zwolniona, a nie używana. Kolejną wadą jest to, że nie będziemy wiedzieć, kiedy zostanie usunięty, ani kiedy zostanie wywołany destruktor.

Algorytm odśmiecania

Istnieje wiele algorytmów wyrzucania elementów bezużytecznych, takich jak liczenie referencji, oznaczanie i zamiatanie, kopiowanie itp. Zobaczmy szczegółowo jeden algorytm dla lepszego zrozumienia. Na przykład, gdy zobaczymy algorytm zliczania referencji, każda pamięć dynamiczna będzie miała liczbę referencji. Po utworzeniu referencji liczba referencji wzrośnie, a po każdym usunięciu referencji liczba referencji zostanie zmniejszona. Gdy liczba referencyjna osiągnie zero, oznacza to, że pamięć jest nieużywana i można ją zwolnić.

Ten algorytm można zaimplementować w języku C ++ przy użyciu określonego typu wskaźnika. Należy zadeklarować określony typ wskaźnika, który można wykorzystać do takich celów, jak śledzenie wszystkich utworzonych odniesień, śledzenie liczby odniesień podczas tworzenia i usuwania odniesienia. Program C ++ może zawierać zarówno ręczne zarządzanie pamięcią, jak i wyrzucanie elementów bezużytecznych w tym samym programie. W zależności od potrzeby można użyć normalnego wskaźnika lub określonego wskaźnika modułu wyrzucającego elementy bezużyteczne.

Podsumowując, odśmiecanie jest metodą przeciwną do ręcznego zarządzania pamięcią. W śmietniku pamięć jest zwalniana automatycznie na podstawie okresowych lub na podstawie określonych kryteriów określających, czy nie jest już używana. Obie metody mają swoje zalety i wady. Można to zaimplementować i stosować zgodnie ze złożonością funkcji, w zależności od używanego języka i jego zakresu.

Polecane artykuły

To jest przewodnik po C ++ Garbage Collection. Tutaj omawiamy ręczne zarządzanie pamięcią i algorytm wyrzucania elementów bezużytecznych, a także zalety i wady. Możesz także przejrzeć nasze inne sugerowane artykuły, aby dowiedzieć się więcej -

  1. Constructor and Destructor w Javie
  2. Funkcje ciągów C ++
  3. Destructor w Javie
  4. Aplikacje C ++ w prawdziwym świecie
  5. 11 najważniejszych funkcji i zalet C ++