Właśnie natknąłem się na ten wpis na blogu, który wspomina o „tupaniu pamięci”:
program w C ++, który jest w stanie z łatwością tupać pamięć (coś, o czym prawdopodobnie nigdy nie słyszałeś, jeśli urodziłeś się w świecie kodu zarządzanego).
Właściwie nigdy o tym nie słyszałem!
Więc co to jest, tupot pamięci, tupot wspomnienie? Kiedy to się dzieje?
c++
c
memory
memory-management
straszny
źródło
źródło
Odpowiedzi:
Pamięć jest „nadeptywana”, gdy fragment kodu manipuluje pamięcią, nie zdając sobie sprawy, że inny fragment kodu używa tej pamięci w sposób powodujący konflikt. Istnieje kilka typowych sposobów nadepnięcia na pamięć.
Jeden z nich przydziela, powiedzmy, 100 bajtów pamięci, ale potem zapisuje coś poza setnym adresem. Ta pamięć może służyć do przechowywania czegoś zupełnie innego. Jest to szczególnie trudne do debugowania, ponieważ problem pojawi się, gdy coś spróbuje uzyskać dostęp do nadepniętej ofiary, a kod, który nadepnął, może być całkowicie niezwiązany.
Innym jest dostęp do pamięci po jej zwolnieniu. Pamięć może być przydzielona dla innego obiektu. Ponownie, kod, który pokazuje problem, może być powiązany z nowo przydzielonym obiektem, który otrzymał ten sam adres i niezwiązany z kodem, który spowodował problem.
źródło
Bardzo często jest to przepełnienie bufora; jako przykład ten kod:
char buffer[8]; buffer[8] = 'a';
będzie „tupać” na czymkolwiek, co stanie się później w pamięci
buffer
. Ogólnie mówiąc, „tupanie” ma miejsce, gdy pamięć jest zapisywana nieumyślnie.źródło
Inne odpowiedzi są w zasadzie poprawne, ale chciałbym podać przykład.
int a[10], i; for (i = 0; i < 11 ; i++) a[i] = 0;
int i, a[10]; for (i = 0; i < 11 ; i++) a[i] = 0;
Te próbki mogą prowadzić do nieskończonej pętli (lub mogą nie prowadzić), ponieważ jest to niezdefiniowane zachowanie.
Bardzo prawdopodobne, że zmienna
i
w pamięci jest przechowywana zaraz po tablicy. Zatem dostępa[10]
może faktycznie uzyskać dostęp,i
innymi słowy, może zresetować licznik pętli.Myślę, że jest to dobry przykład pokazujący „tupanie” pamięci.
źródło