new
et delete
Il nest pas toujours agréable de devoir écrire, afin dallouer un bloc pour une variable de type T :
T *p = (*T) malloc(sizeof(T));
Cette écriture peut être simplifiée en :
T *p = new T;
En C++, new est un opérateur (donc un mot réservé), redéfinissable comme on le verra au chapitre 7, qui calcule automatiquement la taille du type sur lequel il agit, appelle malloc
, et renvoie un pointeur de type adéquat, épargnant ainsi le changement de type. Voici un exemple :
double *dp = new double;
Pour un tableau, il suffit de préciser sa dimension :
double *table = new double[dim];
Notons bien que, dans ce cas, dim
peut être nimporte quelle expression, alors que dans une déclaration de tableau normale, il faut une constante. Cependant, une taille explicite doit être déclarée, il ne faut pas laisser les crochets vides.
Ce mécanisme fonctionne aussi pour les tableaux multidimensionnels :
int (*matrice)[3] = new int [3][3]; float (*grosse)[2][3] = new float [5][2][3];
Notons que les écritures suivantes sont refusées :
int **matrice = new int [3][3]; // incorrect int matrice [][] = new int [3][3]; // incorrect int table[] = new int[10]; // incorrect
La dernière donne par exemple le message Error : Cannot initialize 'int[0]' with 'int near*', impossible dinitialiser le type 'int[0]' avec 'int*' ; les autres sont du même goût.
Lorsque les objets ainsi obtenus ne sont plus utiles, on peut appeler lopérateur delete qui les détruit, comme son nom lindique :
delete dp; delete table; delete matrice;
Comme dans le cas de free
, le pointeur nest pas remis à zéro, et il ne faut appeler delete que sur un bloc alloué par new, ou à la rigueur un pointeur nul.
Ces opérateurs new et delete sont, comme on le voit, bien plus pratiques que les fonctions de <alloc.h>
. Cependant, on a parfois recours à celles-ci pour des opérations spéciales, et en particulier pour réallouer un bloc, car il ny a pas dopérateur équivalent à realloc
.
Précédent | Sommaire | Suivant |