Compteur de reference
Nous avons vu que dès qu’un objet comporte une partie dynamique, il est nécessaire de procéder à des copies « profondes » plutôt qu’à des copies « superficielles », et ce aussi bien dans le constructeur de recopie que dans l’opérateur d’affectation. Cette façon de procéder conduit à ce que l’on pourrait nommer la sémantique naturelle de l’affectation et de la copie. Ainsi, avec : vect a(5), b(12) ; // a contient 5 éléments, b en contient 12 ..... a = b ; // a et b contiennent maintenant 12 éléments // mais, ils restent indépendants a[2] = 12 ; // la valeur de a[2] est modifiée, pas celle de b[2] Mais il est possible d’éviter la duplication de cette partie dynamique en faisant appel à la technique du « compteur de références ». Elle consiste à compter, en permanence, le nombre de références à un emplacement dynamique, c’est-àdire le nombre de pointeurs différents la désignant à un instant donné. Dans ces conditions, lorsqu’un objet est détruit, il suffit de n’en détruire la partie dynamique correspondante que si son compteur de références est nul, pour éviter les risques de libération multiple que nous avons souvent évoqués. Cette technique conduit cependant à une sémantique totalement différente de la copie et de l’affectation : vect a(5), b(12) ; // a contient 5 éléments, b en contient 12 ..... a = b ; // a et b désignent maintenant le même vecteur de 12 éléments // a[i] et b[i] désignent le même élément a[2] = 12 ; // la valeur de a[2] est modifiée ; il en va de même // de celle de b[2] puisqu’il s’agit du même élément Pour mettre en œuvre cette technique, deux points doivent être précisés. L’emplacement du compteur de références : A priori, deux possibilités viennent à l’esprit : dans l’objet lui-même ou dans la partie dynamique associée à l’objet. La première solution n’est guère exploitable car elle obligerait à dupliquer ce compteur autant de fois qu’il y a d’objets pointant sur une même zone ; en outre, il serait très difficile