Laboratorium nr 8
Temat: Alokacja i zwalnianie pamięci.
1) Alokacja i zwalnianie pamięci w C i C++
a. Zarządzanie pamięcią w C
Funkcja
Działanie
malloc()
Alokacja pamięci
calloc()
Alokacja pamięci z wyzerowaniem obszaru
free()
Zwalnianie przydzielonej pamięci
realloc()
Zmiana wielkości alokowanej tablicy
Uwaga: W przypadku korzystania ze wskaźnika do tablicy konieczne jest odpowiednie rzutowanie
typów, np.
int *tab;
tab=(int*) calloc (rozmiar,sizeof(int));
free(tab)
b. Zarządzanie pamięcią w C++
Najbardziej popularnym sposobem zarządzania pamięcią w C++ jest użycie funkcji: new i
delete. Zaletą użycia funkcji new jest:
●
w czasie tworzeniu obiektów istnieje możliwość przesłania parametrów do konstruktora,
●
nie jest potrzebna już funkcja sizeof(), wystarczy jedynie typ danych,
●
zwraca bezpośredni wskaźnik, w związku z czym nie ma potrzeby rzutowania/zamiany typów,
●
ponadto oba operatory można przeciążać odpowiednio dla danej klasy.
int *tab;
tab=new int[n*m];
delete tab;
// dla tablicy wskaźników delete [] tab;
C
C++
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h> // rand()
# define PI 3.14;
int main () {
float *tab;
int i;
tab=(float*)calloc(10,sizeof(float))
;
for(i=0;i<10;i++) {
*(tab+i)=rand()/PI;
printf("Tab[%i]=%f\n",i,tab[i]);
}
free(tab);
return 0;
}
# include <iostream>
# include <stdlib.h> // rand()
# define PI 3.14;
using namespace std;
int main() {
float *tab;
int i;
tab=new float[10];
for(i=0;i<10;i++) {
*(tab+i)=rand()/PI;
cout<<"Tab["<<i<<"]="<<tab[i];
cout << endl;
}
delete tab;
return 0;
}
Uwagi:
•
tablica[i] jest tłumaczone przez kompilator jako:
*(&tablica[0]+i*sizeof(typ_danych)) lub *(tablica+i*sizeof(typ_danych))
•
wyrażenie tablica[i] jest równoważne wyrażeniu *(tablica+i)
•
wyrażenia tablica++ odnosi się do arytmetyki wskaźników i oznacza dostęp do następnego
elementu tablicy, tzn. tablica[i+1]
main.cpp
#include "klasa.h"
int main() {
class baza *osoby=NULL;
int n=0,i=0;
cout << "Liczba danych\n";
cin >> n;
osoby=new baza [n];
osoby[i].pobierz();
osoby[i].wyswietl();
if (osoby!=NULL){
cout << "Czyszczenie\n";
delete osoby;
};
return 0;
}
klasa.h
#include <iostream>
using namespace std;
class baza {
private:
char imie[10];
char nazwisko[25];
char telefon[10];
public:
void pobierz();
void wyswietl();
};
klasa.cpp
#include "klasa.h"
void baza::pobierz(){
cout << "Podaj dane\n";
cout << "\tImie: ";
cin >> this->imie;
cout << "\tNazwisko: ";
cin >> this->nazwisko;
cout << "\tTelefon: ";
cin >> this->telefon;
};
void baza::wyswietl(){
cout << "Dane osobowe\n";
cout << "\tImie: " << this->imie << "\n";
cout << "\tNazwisko: " << this->nazwisko << "\n";
cout << "\tTelefon: " << this->telefon << "\n";
};
2) Zadanie: Zmodyfikuj program bazy danych z poprzedniego ćwiczenia tak, aby: określał liczbę
danych, alokował tablicę o wymaganej wielkości i wczytywał dane do tej tablicy. Przykładowe menu:
1. Wprowadź dane
2. Zapisz dane na dysk
3. Pobierz dane z dysku
4. Wyświetl dane
5. Koniec