Programmation du BIM avec IFC SDK

Using reference pointers

Ce chapitre est extrait du tutorial of Don Burns [Erreur ! Source du renvoi introuvable].

Le mécanisme de reference pointers[1] fournie un ensemble de solutions pour les objets alloués (créés avec new), qui sont partagées par plusieurs entités logicielles. La question de la suppression des objets et du nettoyage de la mémoire est résolue en fournissant un compteur de référence dans l'objet, en l'incrémentant à chaque fois qu'une entité externe en a besoin. Et il décrémente lorsque cette utilisation est faite. Lorsque l'entité finale libère son besoin de l'objet, le compteur de référence passe à 0 et l'objet lui-même est supprimé.

Rien de nouveau dans l'utilisation de reference pointers avec compteurs, ils ont été utilisés de différentes manières dans d'autres logiciels. Cependant, souvent la responsabilité de l'incrémentation,décrémentation et suivi des compteurs est laissé au programmeurs ce qui peut introduire de nombreuses erreurs.

Step::RefPtr est une classe template (définie dans <Step/Referenced.h> ) qui peut être instanciée pour pointer vers n'importe quel objet qui hérite de la classe référencée.

Referenced est une classe légère qui ajoute les fonctionnalités nécessaires pour faire le comptage de référence à un objet. Certaines de ses méthodes sont :

Code en téléchargement.

Comparons les comportements de RefPtr< > à celui d'un pointeur standard :

Code en téléchargement.

myModelRefPtr et myModelPtr sont des variables locales à la fonction someMethod.

Toutes les deux stockent l'adresse de la mémoire qui a été alloué sur le tas de la nouvelle méthode. Ces deux variables sont hors de portée lorsque à la sortie de la méthode .

La différence est que myModelRefPtr incrémente le compteur de référence de l'objet instancié de un (1) tandis que la valeur de la mémoire de l'objet (la valeur renvoyée par new) lui est attribué dans l'affectation par l'opérateur "=".

Lorsque myModelRefPtr est hors de portée, son destructeur est appelé, ce qui décrémente le compteur de référence de l'objet qu'il désigne. Dans le cas ci-dessus, le compteur de référence passe à zéro (0) et l'objet lui-même est supprimé. La mémoire est nettoyée. Toutefois, lorsque myModelPtr est hors de portée, la variable disparaît et la mémoire allouée reste alloué sans aucune référence à elle.

Si nous modifions l'exemple ci-dessus, comme suit, nous commençons à voir l'intérêt d'utiliser RefPtr< >.

Code en téléchargement.

L'utilisation de Get() a besoin d'explication, mais pour l'instant, noter que cette méthode renvoie l'adresse de l' objet object2RefPtr.

A l'intérieur de la classe 1, est un autre RefPtr <Class2>, qui est attribué la valeur de object2RefPtr et le compteur de références de cet object2RefPtr est égal à deux (2). A la sortie de someMethod(), object2RefPtr est hors de portée et décrémente le compteur de référence, mais cette fois à un (1), donc l'objet n'est pas supprimé.

Contrairement aux pointeurs standard, puisque RefPtr<> est en fait une classe, il a quelques méthodes qui peuvent être utilisée.

  1. Reference pointers : En programmation, un pointeur est une variable contenant une adresse mémoire, information utile étant stockée à l'adresse donnée.

PrécédentPrécédentSuivantSuivant
AccueilAccueilImprimerImprimerRéalisé avec Scenari (nouvelle fenêtre)