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.
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(...){}
new(size_t a) par défautnew(size_t a, void* p) définit dans les entêtes C++ qui renvoie la valeur p (sans réservation)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.
}
Une expression delete exp (exp de type class A) a pour conséquence :
~A() sur exp((*exp).~A())operator delete(exp) avec void operator delete(void*){...}Il existe aussi new[] et delete[]
A* t = new A[exp]{{...}, {...}, {...}}
delete[] t;
On peut aussi réserver des tableaux d'objet de classe.
A T[10] = {{a, ...}, {b, ...}, ...}
//appel à A(a, ...} sur la case T[0]
//appelà A{b, ...} sur la case T[1]
A* t = new A[exp]{{...}, {...}, {...}, ...}
//appel au constructeur de A exp fois
delete[] t;
// appel au destructeur de A exp fois
Surcharger new et delete pour changer la manière de réserver la mémoire