Hej.
Piszę już jakiś czas w c++ i w zasadzie nigdy się nie zastanawiałem jak wygląda to co się dzieje w pamięci.
Gdy tworzę sobie zmienną operatorem new np:
new int abc();
To jest alokowana pamięć i tworzony obiekt w tym miejscu gdzieś w pamięci. Kompilator wie ile miejsca potrzebuje patrząc po typie obiektu i tyle alokuje.
Mogę zrobić taki trick że zrobię klasę z 20 polami typu int i też użyć tego operatora żeby sztucznie sobie zaalokować miejsce w pamięci(mogę to zrobić tak samo mallockiem). Operator ten zwróci mi adres na początek zajętego miejsca.
Mając to miejsce w pamięci mogę sobie już gdziekolwiek w tym obszarze chce tworzyć dowolne obiekty różnych klas i dostawać się do nich mając adres początku zajętego miejsca i offsetu stosując rzutowanie i będzie działać.
Jeżeli coś powyżej napisałem nie tak to proszę mnie poprawić.
Ja chciałem jednak sobie zapisać wartość inta w jakimś losowym miejscu pamięci. To tylko 4 bajty więc co się może stać... Chciałem stworzyć za pomocą new(losowyadres)int(5); i zaraz po tym odczytać wartość z tego miejsca. Skończyło się to crashem aplikacji. Popróbowałem kilka razy z innymi adresami i za każdym razem crash.
Teraz moje pytanie jak zachowuje się pamięć komputera. Mam Windowsa 7, 4GB ramu. Czy używając wskaźników jestem w stanie dostać się do każdej komórki tej pamięci? Dlaczego zapisanie jakiejś wartości i odczyt kończy się crashem? Czy coś blokuje programy żeby nie miały dostępu do nie zaalokowanej pamięci, jeżeli tak to jak to obejść? Te 4 bajty jeżeli należały do pamięci zarezerwowanej do jakiejś innej aplikacji to przecież jakie jest prawdopodobieństwo że akurat w tym czasie ktoś do tego obszaru coś zapisywał lub odczytywał. Czy są jakieś przedziały adresów w pamięci które są wolne i na których mógł bym zapisać wartości bez alokowania pamięci?