lab 08
Transkrypt
lab 08
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 malloc() calloc() free() realloc() Działanie Alokacja pamięci Alokacja pamięci z wyzerowaniem obszaru Zwalnianie przydzielonej pamięci 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> define PI 3.14; # include <iostream> # include <stdlib.h> # define PI 3.14; using namespace std; // rand() 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; } // rand() 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. 2. 3. 4. 5. Wprowadź dane Zapisz dane na dysk Pobierz dane z dysku Wyświetl dane Koniec