Wyciek pamięci ma miejsce, gdy programiści tworzą pamięć na stercie i zapominają ją usunąć.
Konsekwencją wycieku pamięci jest zmniejszenie wydajności komputera poprzez zmniejszenie ilości dostępnej pamięci. Ostatecznie, w najgorszym przypadku, może zostać przydzielona zbyt duża ilość dostępnej pamięci, całość lub część systemu lub urządzenia przestanie działać poprawnie, aplikacja ulegnie awarii lub system znacznie zwolni.
Wycieki pamięci są szczególnie poważnym problemem w przypadku programów takich jak demony i serwery, które z definicji nigdy się nie kończą.
Przykład wycieku pamięci
Poniższy przykład ilustruje koncepcję wycieku pamięci.
obiekt do jsona w Javie
C
/* Function with memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Return without freeing ptr*/> >return>;> }> |
>
>
Przyczyny wycieków pamięci w C
- Kiedy dynamicznie przydzielana pamięć nie jest zwalniana przez wywołanie free, prowadzi to do wycieków pamięci. Zawsze upewnij się, że dla każdej dynamicznej alokacji pamięci przy użyciu malloc lub calloc istnieje odpowiednie wolne połączenie.
- W przypadku utraty ścieżki wskaźników odwołujących się do przydzielonej pamięci może się zdarzyć, że pamięć nie zostanie zwolniona. Dlatego śledź wszystkie wskaźniki i upewnij się, że pamięć jest zwolniona.
- Kiedy program kończy się nagle i przydzielona pamięć nie jest zwalniana lub jeśli jakakolwiek część kodu uniemożliwia wywołanie funkcji free, mogą wystąpić wycieki pamięci.
Jak uniknąć wycieków pamięci?
Aby uniknąć wycieków pamięci, pamięć przydzielona na stercie powinna być zawsze zwalniana, gdy nie jest już potrzebna.
Przykład: program zwalniający pamięć przydzieloną w stercie, aby uniknąć wycieku pamięci
Poniższy program pokazuje, że pamięć przydzielona na stercie jest zwalniana, aby uniknąć wycieku pamięci.
C
/* Function without memory leak */> #include> void> f()> {> >int>* ptr = (>int>*)>malloc>(>sizeof>(>int>));> >/* Do some work */> >/* Memory allocated by malloc is released */> >free>(ptr);> >return>;> }> |
>
>
Przykład: program sprawdzający, czy pamięć jest zwolniona, czy nie
Poniższy przykład pokazuje, jak sprawdzić, czy pamięć przydzielona na stercie jest zwolniona, czy nie.
C
// C Program to check whether the memory is> // freed or not> #include> #include> int> main(>void>)> {> >int>* ptr;> >ptr = (>int>*)>malloc>(>sizeof>(>int>));> >if> (ptr == NULL)> >printf>(>'Memory Is Insuffficient
'>);> >else> {> >free>(ptr);> >printf>(>'Memory Freed
'>);> >}> }> // This code is contributed by sarajadhav12052009> |
>
>Wyjście
Memory Freed>
Wniosek
Podsumowując, wycieki pamięci mogą wystąpić, gdy alokujemy pamięć na stercie, ale zapominamy ją zwolnić lub zwolnić. Z powodu wycieków pamięci może wystąpić spadek wydajności, a system stanie się niestabilny. Wycieki pamięci powodują więcej szkód w przypadku długotrwałych programów, takich jak serwery. Aby uniknąć wycieków pamięci, musimy zwolnić dynamicznie przydzielaną pamięć, wywołując funkcje takie jak free().