::operator delete[]
est documenté sur cplusplus.com (ce qui est parfois mal vu) comme suit :
operator delete[]
peut être appelé explicitement comme une fonction ordinaire, mais en C++, delete[]
est un opérateur avec un comportement très spécifique : Une expression avec l'opérateur delete[]
, appelle d'abord les destructeurs appropriés de chaque élément du tableau (si ces éléments sont de type classe), puis appelle la fonction operator delete[]
(c'est-à-dire cette fonction) pour libérer l'espace de stockage.
ainsi le destructeur est appelé n fois (une fois pour chaque élément), puis la "fonction" de libération de mémoire est appelée une fois.
Remarquez que chaque destruction peut prendre un temps différent (ou même une complexité différente) des autres. En général, la plupart des destructions sont rapides et ont la même complexité.... Mais cela ne sera pas le cas si chaque élément détruit est un arbre, un nœud ou un graphe complexe...
Pour les types primitifs comme int
, le destructeur fictif de int
est une opération nulle. Le compilateur optimiserait probablement cela (si demandé).
Vous devriez vérifier le vrai standard C++11, ou au moins son dernier brouillon de travail n3337, qui dit (merci à Matteo Italia pour l'avoir signalé dans un commentaire) à la page 110 de n3337 dans la section 5.3.5.6 :
Si la valeur de l'opérande de l'expression de suppression n'est pas une valeur de pointeur nulle, l'expression de suppression invoquera le destructeur (s'il y en a un) pour l'objet ou les éléments du tableau qui sont supprimés. Dans le cas d'un tableau, les éléments seront détruits dans l'ordre des adresses décroissantes (c'est-à-dire, dans l'ordre inverse de l'achèvement de leur constructeur, voir 12.6.2)
Si vous utilisez -et faites suffisamment confiance à- GCC 4.8 ou mieux, vous pourriez avoir utilisé le compilateur g++
avec l'option -fdump-tree-phiopt
ou -fdump-tree-all
(attention, ils génèrent beaucoup de fichiers!), ou le plugin MELT, pour interroger la représentation intermédiaire Gimple d'un exemple. Ou utilisez -S -fverbose-asm
pour obtenir le code assembleur. Et vous voudrez également ajouter des drapeaux d'optimisation comme -O1
ou -O2
....
NB: Selon moi, cppreference.com est aussi un site intéressant sur le C++, voir ici à propos de delete
(comme commenté par Cubbi)