Lab 08

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


Wyszukiwarka

Podobne podstrony:
lab 08
Lab 08
lab 08
air lab 08 id 53379 Nieznany (2)
lab 08 IIR
CMS Lab 08 Blog 1
CMS Lab 08 Blog 1
Lab 08
Lab 08 2011 2012
lab 08 IIR
Lab 08 Tablice
2011 Lab 08 FEQ SNR
Lab 08

więcej podobnych podstron