Qu'est-ce qu'un "Handle" lorsqu'on parle de ressources dans Windows ? Comment fonctionnent-ils ?
Réponses
Trop de publicités?Ainsi, au niveau le plus basique, un HANDLE, quel qu'il soit, est un pointeur vers un pointeur ou un
#define HANDLE void **
Maintenant, pourquoi l'utiliser ?
Prenons une configuration :
class Object{
int Value;
}
class LargeObj{
char * val;
LargeObj()
{
val = malloc(2048 * 1000);
}
}
void foo(Object bar){
LargeObj lo = new LargeObj();
bar.Value++;
}
void main()
{
Object obj = new Object();
obj.val = 1;
foo(obj);
printf("%d", obj.val);
}
Donc, parce que obj a été passé par valeur (faire une copie et la donner à la fonction) à foo, le printf imprimera la valeur originale de 1.
Maintenant si nous mettons à jour foo en :
void foo(Object * bar)
{
LargeObj lo = new LargeObj();
bar->val++;
}
Il y a une chance que le printf imprime la valeur mise à jour de 2, mais il y a aussi la possibilité que foo provoque une forme de corruption de la mémoire ou une exception.
La raison est la suivante : alors que vous utilisez maintenant un pointeur pour transmettre l'objet à la fonction, vous allouez également 2 Mo de mémoire, ce qui pourrait amener le système d'exploitation à déplacer la mémoire pour mettre à jour l'emplacement de l'objet. Comme vous avez transmis le pointeur par valeur, si l'objet est déplacé, le système d'exploitation met à jour le pointeur mais pas la copie dans la fonction, ce qui peut causer des problèmes.
Une dernière mise à jour à faire pâlir d'envie :
void foo(Object **bar){
LargeObj lo = LargeObj();
Object * b = &bar;
b->val++;
}
Ceci imprimera toujours la valeur mise à jour.
Vous voyez, lorsque le compilateur alloue de la mémoire pour les pointeurs, il les marque comme inamovibles, de sorte que tout remaniement de la mémoire causé par l'allocation du grand objet, la valeur passée à la fonction pointera sur l'adresse correcte pour trouver l'emplacement final dans la mémoire à mettre à jour.
Tous les types particuliers de HANDLEs (hWnd, FILE, etc) sont spécifiques au domaine et pointent vers un certain type de structure pour se protéger contre la corruption de la mémoire.
Pensez à la fenêtre de Windows comme étant une structure qui la décrit. Cette structure est une partie interne de Windows et vous n'avez pas besoin d'en connaître les détails. Au lieu de cela, Windows fournit un typedef pour le pointeur vers la structure pour cette structure. C'est le "handle" par lequel vous pouvez mettre la main sur la fenêtre..,
- Réponses précédentes
- Plus de réponses