Adloun

OCaml (option informatique) · Chapitre 4 · Exercice de TD

Partage d'une référence (aliasing)

Programmation impérative : références et boucles · niveau 3 (difficile)

Énoncé

Donner la valeur finale de chacun des deux fragments, et expliquer la différence.

(* A *)                      (* B *)
let a = ref 0 in             let a = ref 0 in
let b = a in                 let b = ref !a in
a := 5;                      a := 5;
!b                           !b

Corrigé

(A) renvoie 5 ; (B) renvoie 0.

En (A), let b = a lie b à la même référence que a (les deux noms désignent l'unique case mémoire) : modifier via a se voit à travers b. C'est l'aliasing.

En (B), ref !a crée une nouvelle référence initialisée avec la valeur actuelle de a (soit 0) ; a et b sont alors indépendantes, et l'affectation ultérieure sur a ne touche pas b.

(C'est tout l'enjeu du « à bon escient » : une référence partagée par mégarde est une source classique de bogues. On retiendra : let b = a partage, let b = ref !a copie.)

Exercices semblables

Le cours du chapitre · Tous les exercices du chapitre