les new [] / delete [] semblent en bonne paire, mais dans ton ctor le premier déreférencement ne peut qu´etre invalide : tu utilise *Matrix alors que le pointeur Matrix contient n´importe quoi ; faut donc initialiser le premier d´indirection en premier.
Sinon, mes conseils pour améliorer :
- eviter les **, c´est toujours le merdier ; ne s´en servir que quand qqch d´externe doit modifier un pointeur, sinon utiliser des tableaux 1D ( ici, au lieu d´une tableau[h][l] tu fais un tableau[h*l] avec qq operators maisons pour masquer les décalages depuis l´exterieur, et on y gagne en simplicité
- la nomenclature, ton pointeur membre pourrait bien s´appeler m_pValues ou dans le style conformément aux standards couramment adoptés, parceque **Matrix on ne sait pas trop ce qu´on manipule ( pointeur, reference, objet, autre, donnée membre, parametre, var de pile, static, etc.)
- les for avec du code effectif, ça fait super style j´en conviens, mais c´est contre productif. Il est bcp plus clair d´écrire
for ( int index = 0; index < nMaxIndex; ++index) { . .. }
surtout quand on bosse à plusieurs sur le meme code, on zappe vite un truc qui se fait dans le for car c´est assez masqué.
je recommande d´utiliser des instructions en fin de for uniquement pour mettre à jour là ou les var liée à la boucle
D´une part écrire la forme compacte n´optimise rien, mais elle rend plus confus : 90% du code n´a pas besoin d´etre optimisé généralement, donc là où c´est pas la peine, on écrit les choses simplement, et là où faut un truc super tordu, on garde une version " naive" commentée pour aider les autres à comprendre la logique suivie.
Voilà, mes conseils, apres on en fait ce qu´on veut...