Chapitre 16 : Surcharge de new et delete et de new[] et delete[]

Les opérateurs new et delete sont surchargeable hors classe ou à l'intérieur d'une classe.

EXEMPLE HORS CLASSE
void* operator new(size_t s, int a, int b){
...
}

new A(arg1, arg2){exp1, exp2, ...};

//phase 1 : appel à operator new(sizeof(A), arg1, arg2)
//phase 2 : appel au constructeur de la classe A avec les arguments {exp1, exp2, ...}. (A{exp1, exp2}) avec this qui prend l'adresse renvoyée par operator new(sizeof(A), arg1, arg2)

Si l'opérateur new est surchargé dans la classe A alors c'est cette définition qui l'emporte lors d'un new A(...){}

EXEMPLE
A* t = malloc(sizeof(A) * 100);
int i;
for (int i=0; i<100; i++){
  new (t+i) A{...}; // appel au constructeur sur l'adresse t+i sans allocation de mémoire.
}

Hors classe

Une expression delete exp (exp de type class A) a pour conséquence :

  1. appel au destructeur ~A() sur exp((*exp).~A())
  2. appel de operator delete(exp) avec void operator delete(void*){...}

Remarques

Il existe aussi new[] et delete[]

EXEMPLE
A* t = new A[exp]{{...}, {...}, {...}}

delete[] t;

On peut aussi réserver des tableaux d'objet de classe.

EXEMPLE
A T[10] = {{a, ...}, {b, ...}, ...}
//appel à A(a, ...} sur la case T[0]
//appelà A{b, ...} sur la case T[1]
EXEMPLE
A* t = new A[exp]{{...}, {...}, {...}, ...}
//appel au constructeur de A exp fois

delete[] t;
// appel au destructeur de A exp fois

Résumé

Surcharger new et delete pour changer la manière de réserver la mémoire