[ Code Zone ] - Serwis programistyczny - C/C++
Strona główna
| Język C++ | C++
Builder | Programy
| Narzędzia
| Forum | Księga
gości | Sznurki | Kontakt
Dynamiczna alokacja pamięci
Sposoby opisane poniżej służą do rezerwowania
określonych obszarów pamięci dla wskaźników. W języku C były używane
funkcje malloc i free, a wraz z C++ otrzymujemy o
niebo lepsze i prostsze w użyciu operatory new i
delete. Poniżej dwa słowa o ich użyciu.
Użycie operatorów "new" i "delete"
Operator new rezerwuje pamięć dla wskaźnika,
zwracając jego adres. Użycie w najprostszym z przypadkow wygląda
tak:
wskaznik = new typ_wskaznika;
Czyli np.
int * liczba; //deklarujemy
wskaźnikliczba = new int; //przydzielamy pamięć*liczba = 10; // i działamy na wskaźniku korzystając z
dereferencji
Jesli mamy do czynienia z wskaźnikami na klasy, posiadające konstruktory
wymagające podania argumentu, to podajemy go w nawiasach po
operatorze new i typie klasy tzn.
TButton * przycisk;przycisk = new
TButton(Form1);
Można to wszystko zrobić w jednym poleceniu:
TButton * przycisk = new TButton(Form1);
Aby po zakończeniu pracy ze wskaźnikiem zwolnić
przydzieloną pamięć korzystamy z operatora delete. Np.
delete przycisk;
Lub w bezpieczniejszy sposób, sprawdzając czy pamięć
mu zarezerwowana nie została już zwolniona:
if (przycisk) delete przycisk;
Tworzenie dynamicznych tablic
Innym zastosowaniem operatorów new i
delete jest tworzenie dynamicznych tablic,
czyli takich, których rozmiar nie musi być zdefiniowaną stałą.
Użycie w przypadku jednowymiarowej tablicy wygląda tak:
wskaznik = new typ_wskaznika [rozmiar];
Czyli żeby stworzyć tablicę składającą się ze 100
intów napiszemy:
int * liczby = new int [100];
Odwołujemy się do nich jak do standardowej tablicy
tj.:
liczby[50] = 6;
Aby zwolnić pamięć zajmowaną przez całą
tablicę napiszemy:
delete [] liczby;
Nigdy tak:
delete liczby;
Jesli byś tak zrobił, to - jako, że nazwa tablicy
jest wskaźnikiem na jej pierwszy element - zwolniła by się pamięć
zajęta tylko przez pierwszy element, a pozostałe 99 intów zostało by
w pamięci!
Uwaga!
Każdemu wystąpieniu operatora new w programie
musi odpowiadać jedno - nie mniej, ni więcej - wywołanie operatora
delete (istnieją wyjątki w BCB w przypadku dynamicznego
tworzenia komponentów, gdyż forma samemu wywołuje desktruktory
kontrolek, których jest właścicielem). Niezwolnienie alokowanej
pamięci lub zwolnienie tylko fragmentu tablicy przez program
powoduje stałe zaleganie danych i zajmowanie cennych zasobów. Taką
kaszanę robi niestety wiele programów pod Windows napisanych przez
bardzo nieuważnych programistów.
WhiteRAVEN,
18.06.2001
Wyszukiwarka
Podobne podstrony:
F2 66 Pamięci dynamiczneW11 dynamiczna alokacja pamieci10 Dynamiczne przydzielanie pamieci05 Dynamiczne przydzielanie pamięciDynamiczne przydzielanie pamięci metodą stref nieprzesuwalnychW08 dynamiczna alokacja pamieciSprawdź swoją pamięć A42 Dynamika cz1,Modelowanie i symulacja systemów, Model dynamicznyKinematyka i Dynamika Układów MechatronicznychC w6 zmienne dynamiczne wskazniki funkcjiuczenie sie i pamiecZimowym rankiem w Edo pamięci 47 roninówpamiec (3)więcej podobnych podstron