Partager via


Fonctions globales et locales

Les fonctions globales et locales sont prises en charge pour le portage à partir de code 16 bits ou pour maintenir la compatibilité du code source avec Windows 16 bits. À compter de Windows 32 bits, les fonctions globales et locales sont implémentées en tant que fonctions wrapper qui appellent les fonctions de tas correspondantes à l’aide d’un handle vers le tas par défaut du processus. Par conséquent, les fonctions globales et locales ont une surcharge plus importante que d’autres fonctions de gestion de la mémoire.

Les fonctions de tas fournissent plus de fonctionnalités et de contrôle que les fonctions globales et locales. Les nouvelles applications doivent utiliser les fonctions de tas, sauf si la documentation indique spécifiquement qu’une fonction globale ou locale doit être utilisée. Par exemple, certaines fonctions Windows allouent de la mémoire qui doit être libérée avec LocalFree, et les fonctions globales sont toujours utilisées avec Dynamic Data Exchange (DDE), les fonctions du Presse-papiers et les objets de données OLE. Pour obtenir la liste complète des fonctions globales et locales, consultez le tableau dans Fonctions de gestion de la mémoire.

La gestion de la mémoire Windows ne fournit pas un tas local et un tas global distincts, comme Le fait Windows 16 bits. Par conséquent, les familles de fonctions globales et locales sont équivalentes et le choix entre elles est une question de préférence personnelle. Notez que le passage d’un modèle de mémoire segmentée 16 bits à un modèle de mémoire virtuelle 32 bits a rendu inutiles ou inutiles certaines des fonctions globales et locales associées, ainsi que leurs options. Par exemple, il n’y a plus de pointeurs proches et lointains, car les allocations locales et globales retournent des adresses virtuelles 32 bits.

Les objets mémoire alloués par GlobalAlloc et LocalAlloc se trouvent dans des pages privées validées avec un accès en lecture/écriture qui ne peut pas être accessible par d’autres processus. La mémoire allouée à l’aide de GlobalAlloc avec GMEM_DDESHARE n’est pas réellement partagée globalement, car elle l’est dans Windows 16 bits. Cette valeur n’a aucun effet et n’est disponible qu’à des fins de compatibilité. Les applications nécessitant de la mémoire partagée à d’autres fins doivent utiliser des objets de mappage de fichiers. Plusieurs processus peuvent mapper une vue du même objet de mappage de fichiers pour fournir une mémoire partagée nommée. Pour plus d’informations, consultez Mappage de fichiers.

Les allocations de mémoire sont limitées uniquement par la mémoire physique disponible, y compris le stockage dans le fichier de pagination sur le disque. Lorsque vous allouez de la mémoire fixe, GlobalAlloc et LocalAlloc retournent un pointeur que le processus appelant peut utiliser immédiatement pour accéder à la mémoire. Lorsque vous allouez de la mémoire déplaçable, la valeur de retour est un handle. Pour obtenir un pointeur vers un objet de mémoire mobile, utilisez les fonctions GlobalLock et LocalLock .

La taille réelle de la mémoire allouée peut être supérieure à la taille demandée. Pour déterminer le nombre réel d’octets alloués, utilisez la fonction GlobalSize ou LocalSize . Si le montant alloué est supérieur au montant demandé, le processus peut utiliser la totalité du montant.

Les fonctions GlobalReAlloc et LocalReAlloc modifient la taille ou les attributs d’un objet mémoire alloué par GlobalAlloc et LocalAlloc. La taille peut augmenter ou diminuer.

Les fonctions GlobalFree et LocalFree libèrent la mémoire allouée par GlobalAlloc, LocalAlloc, GlobalReAlloc ou LocalReAlloc. Pour ignorer l’objet mémoire spécifié sans invalider le handle, utilisez la fonction GlobalDiscard ou LocalDiscard . Le handle peut être utilisé ultérieurement par GlobalReAlloc ou LocalReAlloc pour allouer un nouveau bloc de mémoire associé au même handle.

Pour retourner des informations sur un objet mémoire spécifié, utilisez la fonction GlobalFlags ou LocalFlags . Les informations incluent le nombre de verrous de l’objet et indiquent si l’objet est ignoré ou a déjà été ignoré. Pour retourner un handle à l’objet mémoire associé à un pointeur spécifié, utilisez la fonction GlobalHandle ou LocalHandle .

Comparaison des méthodes d’allocation de mémoire