Ćwiczenia 10
Podstawy programowania – Dynamiczna alokacja pamięci
W języku C++ wprowadzono operatory new i delete związane z dynamiczną alokacją.
Operator new służy do tworzenia obiektów dynamicznych, a operator delete do usuwania obiektów dynamicznych ( dealokacji pamięci).
Składnia stosowana dla operatora new ma postać nastepującą:
nazwa_wskaźnika=new typ;
lub
nazwa_wskaźnika=new typ( wartosc_poczatkowa);
Powyższe konstrukcje mogą też wystąpić przy inicjalizacji.
Przykład:
Alokacja zmiennych dynamicznych przy użyciu operatora new:
int *px=new int; // inicjalizacja wskaźnika px adresem zmiennej dynamicznej bez inicjalizacji int *py=new int (10); // podobnie jak powyżej, ale inicjalizacją zmiennej dynamicznej wartością 10 double *pv,*pz;
pz=new double;
pv=new double(30);
Składnia operatora delete ma formę następującą:
delete nazwa_wskaźnika;
Jeżeli próba przydzielenia pamięci jest udana i zostanie przydzielona pamięć, operator new zwraca wskaźnik do przydzielonego obszaru pamięci ( wskaźnik do piewszego bajtu). Przydzielony obszar nie ma nazwy, która pełniłaby rolę l-wartości, stąd role tę pełni wyrażenie *nazwa_wskaźnika, np. *px.
Operatory new i delete mogą być też stosowane do dynamicznej alokacji tablic. Alokacja taka ma postać:
nazwa_wskaźnika=new typ[rozmiar];
nazwa_wskaźnika jest nazwą zmiennej wskażnikowej, typ jest typem elementów alokowanej tablicy, a rozmiar oznacza liczbę elementów.
Możliwa jest także alokacja przy inicjalizacji w następującej formie:
typ nazwa_wskaźnika=new typ[rozmiar];
Dealokacja przy użyciu operatora delete ma postać:
delete[ ]nazwa_wskaźnika;
Przykład:
Użycie operatorów new i delete.
Zadania:
1. Napisz program, który dynamicznie zaalokuje zmienną typu int. Program powinien wczytać z klawiatury wartość i podstawić ją do zaalokowanej zmiennej. Następnie program powinien wydrukować na ekranie wartość zmiennej, po czym zwolnić pamięć i zakończyć działanie.
2. Napisz program, który dynamicznie zaalokuje tablicę typu int I wypełni ją kolejnymi liczbami, a na koniec zwolni pamięć.
3. Napisz program definiujący strukturę Punkt zawierającą pola X i Y (współrzędne punktu).
Stwórz wskaźnik do tej zmiennej za pomocą operatora new. Wczytaj z klawiatury wartości pól tej zmiennej I przypisz je do niej z użyciem wskaźnika.
4. Stwórz funkcję RezerwujTablice która przyjmuje jako parameter wejściowy rozmiar tablicy (liczba całkowita), rezerwuje pamięć na tablicę typu float o zadanym rozmiarze I zwraca wskaźnik do niej. Pokaż użycie tej funkcji na przykładzie.
5. Ćwiczenie do nauki:
1) Znaku końca łańcucha '\0'
2) Alokacji pamięcia za pomocą ‘new’
3) Usuwania pamięci za pomocą ‘delete’
Przekonwertuj zmienną ‘ch’ w zmienną wskaźnikową stworzoną za pomocą operatora new.
#include < iostream.h >
int main() {
char ch = 'Z';
char *string = NULL;
string = new char[2]; // tutaj zaalokowałem pamięć, dlaczego na 2 znaki ?
/* Zapisz tutaj konstrukcję string’a */
cout << string << endl;
/* użyj operatora delete */
return 0;
}
Zadanie domowe:
1. Napisz program, który będzie wczytywał z klawiatury (lub jako parameter wywołania programu) jedną liczbę – rozmiar macierzy, np. 3. Następnie będzie alokował pamięć na trzy macierze typu float o zadanym rozmiarze, np. 3x3. W kolejnym kroku program ma wypełnić dwie z nich losowymi liczbami z przedziału od -10 do 10 (wykorzystaj funkcję rand() z biblioteki cstdlib). Następnie program ma wykonać mnożenie tych dwóch macierzy i wynik zapisać w trzeciej, do tej pory pustej. Na koniec program ma wypisać wszystkie trzy macierze na ekran i zwolnić zaalokowaną pamięć.
2. Stwórz program, który będzie implementował ideę listy łączonej (patrz rysunek)
Każdy element (noda) listy ma być zmienną strukturalną zawierającą dwa elementy: liczbę typu int (info) oraz wskaźnik na kolejny element (link).
Zaimplementuj tworzenie takiej listy n elementowej, gdzie n podawane jest z klawiatury przez użytkownika. Wypełnij elementy listy (info) losowymi liczbami. Ustaw odpowiednio wskaźniki wszystkich elementów. Na koniec wypisz zawartość całej listy (parameter info) przechodząc po niej za pomocą wskaźników.