3 votes

utilisation du pointeur de vide en c/c++

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 ?

14voto

Martin Beckett Points 60406

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

2voto

user470379 Points 3935

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.

2voto

Jens Gustedt Points 40410

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.

1voto

Lou Points 1427

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X