new
și delete
.new
. new
este urmat de un tip de dată și, dacă este cazul uneia sau mai multor secvențe, de numărul de elemente al acestora cuprins între paranteze drepte []
. Operatorul returnează un pointer către începutul blocului de memorie alocat. Sintaxa este:
pointer = new tip_data
pointer = new tip_data [numar_de_elemente]
tip_data
. A doua instrucțiune este folosită pentru a aloca un bloc (tablou) de elemente de tip tip_data
, unde numar_de_elemente
este o valoare întreagă reprezentând numărul acestora. De exemplu:
|
|
int
și returnează un pointer la primul element al secvenței, pointer care i se atribuie lui foo
(variabilă pointer). De aceea, foo
pointează acum către un bloc valid de memorie care poate stoca până la cinci elemente de tip int
.foo
este un pointer și, de aceea, primul element către care pointează foo
poate fi accesat die cu expresia foo[0]
fie cu expresia *foo
(cele două sunt echivalente). Al doilea element poate fi accesat fie cu foo[1]
fie cu *(foo+1)
, și așa mai departe...new
. Cel mai important este faptul că dimensiunea unui tablou normal trebuie să fie o expresie constantă, ceea ce înseamnă că dimensiunea trebuie determintă la momentul proiectării programului, înainte de rularea lui, în timp ce alocarea dinamică realizată cu operatorul new
permite gestionarea memoriei în timpul execuției, folosind ca dimensiune orice variabilă.new
vor fi onorate de către sistem. bad_alloc
apare cănd alocarea eșuează. Excepțiile sunt un instrument puternic C++ pe care îl vom explica mai tărziu în aceste lecții. Deocamdată, ar trebui să știți că dacă apare o asemnea exceptie și nu este tratată de un handler specific, execuția programului se încheie.new
și cea folosită într-o declarație ca următoarea:
|
|
nothrow
și când o alocare eșuează, în loc de apariția excepției bad_alloc
sau terminarea programului, pointer-ul returnat de new
este un pointer nul, iar programul își continuă execuția normală.nothrow
, declarat în header <new>
, ca argument pentru new
:
|
|
foo
este pointerul nul:
|
|
nothrow
pare să producă un cod mai puțin eficient decât excepțiile, căci presupune verificarea explicită a obținerii pointerului nul după fiecare alocare. De aceea, în general, este preferat mecanismul excepțiilor, cel puțin pentru alocările critice. Totuși, majoritatea exemplelor noastre vor folosi mecanismul nothrow
pentru simplicitatea sa.delete
, a cărui sintaxă este:
|
|
new
, iar a doua eliberează memoria alocată pentru un tablou de elemente folosind new și o dimensiune între paranteze drepte ([]
).delete
poate fi un pointer către un bloc de memorie alocat anterior cu new
sau un pointer nul (în cazul unui pointer nul, delete
nu are niciun efect).
|
|
Cate numere vrei sa tastezi? 5 Tasteaza numar: 75 Tasteaza numar: 436 Tasteaza numar: 1067 Tasteaza numar: 8 Tasteaza numar: 32 Ai tastat: 75, 436, 1067, 8, 32, |
i
), nu este o expresie constantă:
|
|
i
o valoare așa de mare încât sistemul să nu dispună de suficientă memorie pentru a o aloca. De exemplu, când am răspuns cu 1 billion la întrebarea "Cate numere vrei sa tastezi? ", sistemul meu nu a putut aloca atâta memorie pentru program și am primit pe ecran mesajul pregătit pentru asemenea situații (Eroare: memoria nu poate fi alocata!
).nothrow
) fie prin prinderea excepției.new
și delete
pentru alocarea dinamică a memoriei. Dar acești operatori nu erau definiți în limbajul C; în schimb, se folosea o bibliotecă din care se apelau funcțiile malloc
, calloc
, realloc
și free
, definite în header-ul <cstdlib>
(cunoscut ca <stdlib.h>
în C). Funcțiile sunt încă disponibile și în C++ și pot fi folosite pentru alocarea și eliberarea memoriei dinamice.new
, deci ele nu pot fi amestecate; fiecare ar trebui gestionat cu propriul set de funcții sau operatori.Previous: Pointeri | Index | Next: Structuri de date |