2/06/05  
 

Rien

Modifs

Remarques sur la gestion mémoire des matrices (et objets accociés)

Contexte:

pour ceux qui comme moi n'y voient pas clair dans le rôle de status (je vous rassure, c'est normal, c'est pas correctement appliqué)

Schématiquement:

Idéalement, on devrait avoir ce genre de code :

Matrix & funct1(Matrix &arg)
{
	INCREF(arg);               // empeche la destruction de arg par "funct2" :  arg.status++
	// utilisation de arg
	Matrix &res = funct2(arg); // res.status = 0
  INCREF(res)                // je signale que j'utilise res (sinon, n'importe quel appel avec res supprimera res) 
	// utilise res 
	// ...
	DECREF(res);               // j'en ai fini avec res : arg.status-- ; if(arg.status==0) delete &arg
	// creation de la valeur retour
	Matrix &ret = *new Matrix(); // ret.status = 1    
	// ...
	DECREF(arg);              // arg.status-- ; if(arg.status==0) delete &arg
	SETRETURN(ret);           // ret.status--;
}

C'est loin d'être fait comme ça dans le code actuel. La plupart du temps, le programmeur essaye de se démerder en fin de fonction et, par exemple, le INCREF du début est systématiquement oublié...

Qui sait par exemple que si on fait : Matrix &C = A+B, il faut incrémenter le status de C (INCREF(C)) sinon, tout appel à une fonction utilisant C détruira cette variable et mènera à un beau plantage! bien sur, il est possible d'écrire Matrix C = A+B et, là, ça marche mais au prix d'une copie supplémentaire.

Les dangers viennent du fait qu'on utilise partout des références (les références permettent une écriture simple des appels). idéalement, il faudrait utiliser soit des pointeurs, soit, encore mieux, des smart pointers (auto_ptr<Matrix>):

Fichiers ajoutés

A oeMTK/oeMTKEnums.cpp
A oeMTK/oeMTKEnums.h

 

Fichiers ajoutés

A mtPython/testMTK.*

 

 

Back to Metafor web server
created :1/06/05   modified : 2/06/05
contact : r_boman_AT_yahoo.fr