Hey, je me demande comment les pointeurs vides sont appliqués dans le monde réel pour rendre un logiciel plus sûr, plus flexible. Par exemple, je sais que les pointeurs void, le pointeur sur lequel ils vont être lancés est caché à l'extérieur, ce qui rend le logiciel plus sûr. Y a-t-il d'autres raisons pour lesquelles vous utiliseriez les pointeurs vides ?
Réponses
Trop de publicités?Les pointeurs vides ne rendent pas le logiciel plus sûr.
La raison d'utiliser void* en c est une forme de polymorphisme - si vous ne savez pas quel type de données sera utilisé, vous pouvez passer un void* à un autre type de données.
En C++, il est moins nécessaire d'utiliser void* et le langage permet d'éviter certaines des utilisations du C
Par exemple, je sais que le vide le pointeur qu'il va mouler en est caché à l'extérieur, ce qui rendra un logiciel plus sûr.
Une fois compilé, il n'y a rien de flagrant dans le code d'assemblage qui révèle le type du pointeur car un type est un concept de niveau supérieur - il n'y a rien d'autre que des largeurs de registre dans le code d'assemblage. (Théoriquement, en étudiant le code assembleur, vous pourriez probablement déduire la taille du type de données et ce à quoi servent les différents champs, mais l'utilisation d'un pointeur void n'y changerait rien. Mais je m'éloigne du sujet).
Ceci étant dit, le seul autre moyen pour que quelque chose "d'extérieur" connaisse les types de pointeurs serait l'API que vous fournissez (probablement par le biais d'un fichier d'en-tête). Mais c'est l'un des avantages d'avoir une API - permettre à quelqu'un d'autre de vous passer un pointeur n'est absolument pas une garantie que vous utilisez ce type en interne.
Il n'y a aucune excuse, même en C, pour utiliser void*
de la manière dont vous le mentionnez. Il serait préférable d'utiliser un pointeur sur un type incomplet.
typedef struct myInternal myInternal;
myInternal* getIt(void);
int doIt(myInternal*);
Cela a le même effet que de cacher la structure interne / l'implémentation à l'utilisateur. Mais la programmation est beaucoup plus facile et, en particulier, l'utilisateur ne peut pas mélanger différentes interfaces opaques de cette manière.
La raison typique d'utiliser un void * est de fournir un contexte à l'utilisateur d'une API/librairie. Le contexte fourni est souvent un pointeur et le void * le rend opaque. Le problème auquel est confronté le développeur de la bibliothèque est de valider le void * lorsqu'il est renvoyé. Cela peut s'avérer assez difficile. En fait, la bibliothèque aurait mieux fait de fournir un identifiant à l'utilisateur, qui peut être plus facilement validé sans avoir exposé les données internes.
En d'autres termes, si vous envisagez d'utiliser un void *, ne le faites pas.