Pamięć wirtualna – mechanizm zarządzania pamięcią komputera zapewniający procesowi wrażenie pracy w jednym, dużym, ciągłym obszarze pamięci operacyjnej podczas, gdy fizycznie może być ona pofragmentowana, nieciągła i częściowo przechowywana na urządzeniach pamięci masowej. Systemy korzystające z tej techniki ułatwiają tworzenie rozbudowanych aplikacji oraz poprawiają wykorzystanie fizycznej pamięci RAM w systemach wielozadaniowych.
ASLR (Address Space Layout Randomization) tłumaczony jest jako mechanizm losowego generowania lokalizacji alokacji pamięci wirtualnej.
Parę kolejnych informacji będzie dotyczyło języka C++. Omawiane konstrukcje nie będą na egzaminie i nie można ich bezpośrednio przenieść do języka C.
Referencje są aliasami (innymi nazwami) dla zmiennych. Referencja musi być zainicjalizowana podczas deklaracji i nie można jej zmienić, aby wskazywała na inną zmienną. Referencje nie mogą mieć wartości “null”.
Wskaźniki są zmiennymi, które przechowują adresy innych zmiennych w pamięci. Wskaźniki mogą być zmieniane, aby wskazywały na różne zmienne lub przyjmowały wartość “null”. Wskaźniki można deklarować bez inicjalizacji, ale zaleca się inicjalizować je wartością “null” lub adresem zmiennej.
#include <iostream>
using namespace std;
void funkcja_przyjmujaca_referencje(int &ref)
{
ref = 50;
}
void funkcja_przyjmujaca_wskaznik(int *ptr)
{
if (ptr) {
*ptr = 100;
}
}
int main()
{
int a = 10;
int b = 20;
funkcja_przyjmujaca_referencje(a);
cout << "a=" << a << endl;
funkcja_przyjmujaca_wskaznik(&b);
cout << "b=" << b << endl;
return 0;
}
Poprawnie:
lub
Wątpliwe dla niektórych kompilatorów
Wskaźnik na stałą wartość:
Stały wskaźnik:
Stały wskaźnik na stałą wartość:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int i=0;
const int *a=&i;
int * const b=&i;
int const * const c=&i;
*a = 1; /* kompilator zaprotestuje */
*b = 2; /* ok */
*c = 3; /* kompilator zaprotestuje */
a = b; /* ok */
b = a; /* kompilator zaprotestuje */
c = a; /* kompilator zaprotestuje */
return 0;
}
malloc
Funkcja służy do dynamicznego rezerwowania miejsca w pamięci. Gdy funkcja zostanie wywołana, w przypadku sukcesu zwróci wskaźnik do nowo zarezerwowanego miejsca w pamięci; w przypadku błędu zwraca wartość NULL.
free
Funkcja free zwalnia blok pamięci wskazywany przez ptr wcześniej przydzielony przez malloc
. Jeżeli ptr ma wartość NULL funkcja nie robi nic.
int
Inaczej - bez nazwanych argumentów.
#include <stdio.h>
int dodaj(int a, int b)
{
return a + b;
}
int odejmij(int a, int b)
{
return a - b;
}
int wykonaj_operacje(int (*operacja)(int, int), int a, int b)
{
return operacja(a, b);
}
int main()
{
int a = 5, b = 11;
int (*wsk_dodaj)(int, int) = dodaj;
int (*wsk_odejmij)(int, int) = odejmij;
printf("Dodawanie: %d\n", wykonaj_operacje(wsk_dodaj, a, b));
printf("Odejmowanie: %d\n", wykonaj_operacje(wsk_odejmij, a, b));
return 0;
}
Pełna analogia.
Dereferencja niezainicjalizowanych wskaźników: