D'après ce que je peux voir, il existe deux formes omniprésentes de gestion des ressources: la destruction déterministe et explicite. Des exemples des premiers seraient des destructeurs C ++ et des pointeurs intelligents ou le sous-marin DESTROY de Perl, tandis qu'un exemple du second serait le paradigme des blocs à gérer des ressources de Ruby ou l'interface IDispose de .NET.
Les langues plus récentes semblent opter pour cette dernière, peut-être comme effet secondaire de l'utilisation de systèmes de collecte des ordures de la variété sans comptage de références.
Ma question est la suivante: étant donné que les destructeurs de pointeurs intelligents ou de systèmes de collecte des ordures comptant les références - presque la même chose - permettent la destruction implicite et transparente des ressources, est-ce une abstraction moins fuyante que les types non déterministes qui s'appuient sur des explicites notation?
Je vais donner un exemple concret. Si vous avez trois sous-classes C ++ d'une même superclasse, l'une peut avoir une implémentation qui ne nécessite aucune destruction spécifique. Peut-être que sa magie opère d'une autre manière. Le fait qu'il n'ait pas besoin de destruction spéciale n'est pas pertinent - toutes les sous-classes sont toujours utilisées de la même manière.
Un autre exemple utilise des blocs Ruby. Deux sous-classes doivent libérer des ressources, donc la superclasse opte pour une interface qui utilise un bloc dans le constructeur, même si d'autres sous-classes spécifiques peuvent ne pas en avoir besoin car elles ne nécessitent aucune destruction spéciale.
Est-il vrai que ce dernier divulgue les détails de mise en œuvre de la destruction des ressources, alors que le premier ne le fait pas?
EDIT: Comparer, disons, Ruby à Perl pourrait être plus juste car l'un a une destruction déterministe et l'autre pas, mais ils sont tous deux récupérés.
(*ptr).Message()
ou de manière équivalente ptr->Message()
. Il existe un ensemble infini d'expressions autorisées, comme ((*ptr))->Message
c'est également équivalent. Mais ils se résument tous àexpressionIdentifyingAnObject.Message()