Bonjour,
Je suis entrain de faire une classe qui a besoin de savoir détecter les cycles de pointeurs pour pourvoir bien les supprimer de façon à ce qu'il ne reste plus rien dans le tas.
Comment est ce que je pourrai procéder??
Merci d'avance.
Bonjour,
Je suis entrain de faire une classe qui a besoin de savoir détecter les cycles de pointeurs pour pourvoir bien les supprimer de façon à ce qu'il ne reste plus rien dans le tas.
Comment est ce que je pourrai procéder??
Merci d'avance.
boost::weak_ptr/shared_ptr font ça, tu peux voir à voir comment ils s'y prennent![]()
Bonjour,
Le principe d'un pointeur est que derrière lui se cache une zone mémoire.
Quand on déclare un pointeur, on ne fait rien d'autre que dire "là se trouvera le début d'une zone mémoire", ou plutôt "là est l'adresse physique du début d'une zone mémoire".
A ce stade, on a écrit
TRUC *ptrSurTruc;
TRUC est une structure, une classe, un typedef, c'est à dire le type de l'objet sur lequel va pointer ptrSurTruc.
Maintenant on veut travailler avec cet objet. On doit réserver une zone mémoire de taille nécessaire, c'est à dire la taille de TRUC.
Il y a deux instructions qui permettent cela : malloc (standard C) et new (mot clé C++)
Dans les deux cas, la mémoire réservée est disponible, mais pas à l'abri d'un écrasement, jusqu'à ce qu'elle soit libérée.
Les instructions de libération (ou destruction) sont respectivement free(ptrSurTruc); et delete ptrSurTruc;
Free est une fonction comme l'est aussi malloc(...), new et delate sont des mort clé.
La bonne méthode est de libérer la mémoire dans le sens inverse que celui où elle a été allouée, et de préférence au même niveau, c'est à dire si l'allocation a été faite dans le main() il vaut mieux faire la libération dans le main, si elle a été faite dans une fonction, la libération sera faite dans une fonction appelée au même niveau.
Par contre, si votre question est de savoir comment vérifier si toute la mémoire a bien été libérée, mon compilateur le fait, on peut développer cela, mais ce sont des traitements très lourds.
Cependant, il peut y avoir une solution assez simple qui consiste à mettre dans un variable la quantité de mémoire disponible en début d'exécution, lire la même valeur en fin d'exécution et comparer. Ca peut servir, mais c'est sans garantie, puisque d'autre processus peuvent être intervenus entre-temps.
Cordialement.
Ils detectent les cycles? Tu as une reference?
A ma connaissance le principe des weak_ptr est d'avoir des pointeurs qui ne compte pas pour savoir si un objet est vivant ou pas et qui seront remis a NULL quand on GC l'objet pointe (ce qui est possible quand il n'y a pas d'autres pointeurs non weak qui referencent l'objet). On peut parfois utiliser un weak_ptr pour eviter d'avoir un cycle, mais il y a d'autres usages.
Partager