Opérateurs new et delete

Il n’est pas toujours agréable de devoir écrire, afin d’allouer 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 n’importe 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 d’initialiser 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 l’opérateur delete qui les détruit, comme son nom l’indique :

delete dp;
 delete table;
 delete matrice;

Comme dans le cas de free, le pointeur n’est 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 n’y a pas d’opérateur équivalent à realloc.

Précédent Précédent Sommaire Sommaire Suivant Suivant