Quand tu as :
m_Tableau = (CReleve**)Nouveau;
Nouveau est un pointeur sur une zone mémoire, de type indéterminé. C'est à dire qu'il pointe sur le premier élément de cette zone.
Là, tu vas forcer par l'intermédiaire d'un cast Nouveau à être considéré comme un pointeur vers un pointeur de CReleve. Dans ce pointeur de pointeurs, les deux pointeurs n'ont pas le même rôle. Le pointeur bleu est un pointeur classique, le pointeur rouge va par la suite être utilisé avec de l'arithmétique de pointeur (par exemple quand tu écris m_Tableau[m_Nombre]) afin de naviguer dans la mémoire allouée comme s'il s'agissait d'un tableau.
Dans un certain sens, ce code gère donc l'agrandissement d'un tableau de pointeurs.
Dans un certain sens seulement, car ce code a plein de problèmes :
- L'utilisation de realloc n'est possible qui si ce qu'on ré alloue répond à certains critères précis (un peu longs à citer ici. Il faut que ce soit un POD, en gros, dès qu'il s'agit d'une vrai classe, et non plus d'une donnée existant en C, ça n'est plus valide). Dans notre cas, on ré alloue des CReleve*, et les pointeurs répondent à ces critères, donc ça marche. Mais dans le cas général (ou si l'on remplace les pointeurs par des pointeurs intelligents), realloc peut poser des problèmes.
- tester qu'un new ne retourne pas NULL est idiot, car new ne peut pas retourner NULL (il lance une exception en cas de manque de mémoire).
- Il semble que ce code gère l'extension d'un tableau existant. Par contre la complexité de l'algorithme utilisé va dépendre fortement de l'état de la mémoire (car il se base sur realloc), ce qui fait que je n'ai aucune idée de la complexité de l'ajout de N éléments avec cet algorithme. Je préfère pour ma part un algorithme dont je maîtrise la complexité.
En C++, on gérera en général un tableau de pointeurs redimensionnable avec un simple std::vector<CReleve*> (ou des structures plus évoluées, suivant ce qu'on veut faire de ces pointeurs par la suite). On n'a plus alors à se préoccuper des aspects bas niveau de gestion de mémoire.
Par curiosité, ce cours vient-il d'un livre ? Si oui lequel ?
Partager