background image

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))

background image

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