Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

C, tablice przy pomocy malloc

piotrek5001 22 Maj 2017 21:54 543 3
  • #1 22 Maj 2017 21:54
    piotrek5001
    Poziom 24  

    Cześć,
    Szybkie pytanie. Przydzielam sobie 10 bajtów pamięci:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czemu próba przypisania, np:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    nie powoduje Access Violation skoro jest grubo powyżej przydzielonej pamięci?

    0 3
  • Pomocny post
    #2 22 Maj 2017 23:35
    michcior
    Poziom 30  

    Szybka odpowiedź.

    Trzeba Ci wiedzieć jak działa procesor i Memory Management Unit (MMU). Działa tak, że buduje z kawałków pamięci fizycznej, pamięć wirtualną. Z kawałków o ustalonej długości, im mniejsze kawałki tym lepsza oszczędność pamięci ale większa tablica mapowania fizycznej pamięci na wirtualną i kupa innych kłopotów. Każda aplikacja porusza się w stworzonej dla niej przestrzeni wirtualnej. Jak brakuje, to system dokleja kolejne kawałki zwiększając pamięć, np w wyniku operacji malloc. Jak zwolni się cały kawałek, to go zwraca do puli systemowej. Puki nie rąbniesz adresem w obszar nie przydzielony dla aplikacji, to nie ma szans na wykrycie przez sprzęt takiego głupiego błędu. Dopiero jak adres wyjdzie poza przydzieloną wirtualną pamięć, MMU hardware może zgłosić "Segmetation Fault" (w W. Access Violation). W zasadzie dynamiczna alokacja jest możliwa tylko dzięki MMU. Przydzielanie każdej aplikacji a dokładniej procesowi jego "prywatnej" przestrzeni zabezpiecza przed tym, że taki głupi błąd popsuje działanie innego procesu.
    Takie błędy są bardzo wredne, właśnie dlatego, że nie są wykrywane, szczególnie jeśli "paskudzimy" coś na stosie. Coś działa a potem dodamy jedną nieznaczącą linijkę i przestaje. Bo akurat w nowym przypadku "zamazujemy" jakieś używane bajty a przedtem psuliśmy nie użyty obszar.

    Ta właściwość MMU, to znaczy zgłaszanie błędu w przypadku braku zmapowania może być pożyteczna do budowy "pliku wymiany". Odwołanie się do adresu nie zmapowanego powoduje wyjątek który w obsłudze do pamięci fizycznej ładuje z twardego dysku zawartość odpowiadającą temu kawałkowi wirtualnemu, po czym mapuje ten kawałek w odpowiednie miejsce. Cały czas skomplikowane algorytmy zwalniają nie używane kawałki i zrzucają na dysk.

    0
  • Pomocny post
    #3 23 Maj 2017 00:26
    krru
    Poziom 32  

    Jak kolega wyżej wyjaśnił Access Violation to nie mechanizm sprawdzania działający na poziomie malloc/free. Do tego celu służy np. Valgrind, to jest taki "debugger allokacji/zwalniania pamięci".

    0
  • #4 23 Maj 2017 08:10
    piotrek5001
    Poziom 24  

    Panowie, super wyjaśnienie. Dzięki :)

    0