• [^] # Re: Donc pour résumer...

    Posté par . En réponse à la dépêche C++17, Genèse d’une version mineure. Évalué à 1. Dernière modification le 06 octobre 2016 à 11:18.

    Pour conclure, je veux bien un cas d'usage quotidien de shared_ptr. Si je peux être détrompé, tant mieux.

    Disclaimer : je n'y connais rien en C++ donc ce que je vais dire repose essentiellement sur ma compréhension de la documentation de shared_ptr.

    On peut y lire :

    std::shared_ptr est un pointeur intelligent qui permet le partage d'un objet via un pointeur. Plusieurs instances de shared_ptr peuvent posséder le même objet, et cet objet est détruit dans l'un des cas suivant :

    • le dernier shared_ptr possédant l'objet est détruit ;

    • le dernier shared_ptr possédant l'objet est assigné à un autre pointeur via operator=() ou reset().

    Quand je lis cela, je pense immédiatement, par exemple, à la représentation mémoire des listes en OCaml1 . Les listes dans ce langage sont des listes chaînées qui partagent leur queue. Je m'explique.

    let l = [1; 2; 3];;
    (* la représentation mémoire de celle-ci est une chaîne :
    | 1 | -|-->| 2 | -|-->| 3 | -|-->| |
    *)

    Chaque élément de la liste contient la valeur et un pointeur vers la queue ou la suite de la liste qui se termine par un « pointeur nul »2 . Maintenant si je crée deux listes à partir de celle-ci en rajoutant un élément en tête, elles partageront en mémoire la suite l :

    let l1 = 4 :: l and l2 = 5 :: l;;
    (* ce qui en mémoire donne :
    | 4 | \|
     \
     -->| 1 | -|-->| 2 | -|-->| 3 | -|-->| |
     /
    | 5 | /|
    *)

    Ai-je bien compris le concept de shared_ptr et est-ce une utilisation possible ? Pour ce qui est de la libération mémoire par le GC des listes en OCaml, la règle est équivalente à la première de la doc sus-citée : « le dernier shared_ptr possédant l'objet est détruit ».


    1. c'est en fait le cas de toutes les structures récursives à base de types somme, comme les arbres.

    2. c'est pas tout à fait ça mais c'est pour simplifier, c'est plutôt une valeur constante qui correspond à la liste vide et qui est la même pour toutes les listes quelque soit le type des éléments.

    Sapere aude ! Aie le courage de te servir de ton propre entendement. Voilà la devise des Lumières.