Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Choix de la méthode d’allocation appropriée
Utilisez les conseils suivants pour sélectionner l’API d’allocation de mémoire appropriée pour votre scénario :
| Scénario | API recommandée | Remarques |
|---|---|---|
| Allocations C++ à usage général | new / std::make_unique / std::make_shared |
Choix par défaut pour le code C++. Utilise le tas CRT en interne. RAII garantit le nettoyage automatique. |
| Allocations C à usage général | malloc / calloc / realloc |
Choix par défaut pour le code C. Portable sur plusieurs plateformes. |
| Allocations supérieures à ~1 Mo ou nécessitant un contrôle au niveau de la page | VirtualAlloc | Alloue au niveau de la granularité de la page (généralement 4 Ko). Permet de réserver de grandes plages d’adresses, de protéger des pages ou de la mémoire avec des attributs de protection spécifiques (PAGE_READWRITE, PAGE_EXECUTE_READetc.). |
| De nombreuses petites allocations avec un contrôle personnalisé (par exemple, l’allocateur de pool) | HeapAlloc / TasCreate | Créez un tas privé pour le contrôle d’isolation ou de sérialisation. Utilisez HEAP_NO_SERIALIZE uniquement si le tas est exclusivement monothread. |
| Interopérabilité COM (mémoire marshalée) | CoTaskMemAlloc | Obligatoire lorsque la mémoire traverse les limites de l’appartement COM. Les stubs générés par MIDL utilisent CoTaskMemAlloc/CoTaskMemFree. |
| Code hérité utilisant la mémoire déplaçable | GlobalAlloc / LocalAlloc | Évitez le nouveau code. Celles-ci ajoutent une surcharge sur HeapAlloc et existent principalement pour la compatibilité descendante avec les opérations du Presse-papiers et certaines API Win32 qui les nécessitent. |
Important
Toujours associer correctement les fonctions d’allocation et de désallocation. La mémoire allouée HeapAlloc avec doit être libérée avec HeapFree ( pas free() ou LocalFree. Le mélange des familles d’allocation/de désallocation provoque une altération du tas difficile à diagnostiquer.
Note
VirtualAlloc vs HeapAlloc : VirtualAlloc fonctionne avec une granularité de page (minimum 4 Ko, réservations alignées sur SYSTEM_INFO.dwAllocationGranularity, généralement 64 Ko). Allocation de nombreux petits objets avec virtualAlloc gaspille l’espace d’adressage. Utilisez HeapAlloc (ou malloc/new) pour les allocations petites et fréquentes. Utilisez VirtualAlloc lorsque vous devez réserver des régions d’adresses volumineuses, une protection de page de contrôle ou implémenter des allocateurs personnalisés.
Comparaison détaillée
Voici une brève comparaison des différentes méthodes d’allocation de mémoire :
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- Malloc
- nouveau
- VirtualAlloc
Bien que les fonctions GlobalAlloc, LocalAlloc et HeapAlloc allouent finalement de la mémoire à partir du même tas, chacune fournit un ensemble légèrement différent de fonctionnalités. Par exemple, HeapAlloc peut être invité à déclencher une exception si la mémoire n’a pas pu être allouée, une fonctionnalité non disponible avec LocalAlloc. LocalAlloc prend en charge l’allocation de handles qui permettent le déplacement de la mémoire sous-jacente par une réaffectation sans modifier la valeur du handle, une fonctionnalité non disponible avec HeapAlloc.
À compter de Windows 32 bits, GlobalAlloc et LocalAlloc sont implémentés en tant que fonctions wrapper qui appellent HeapAlloc à l'aide d'un handle au tas par défaut du processus. Par conséquent, GlobalAlloc et LocalAlloc ont une surcharge supérieure à HeapAlloc.
Étant donné que les différents allocateurs de tas fournissent des fonctionnalités distinctives à l’aide de différents mécanismes, vous devez libérer de la mémoire avec la fonction correcte. Par exemple, la mémoire allouée avec HeapAlloc doit être libérée avec HeapFree et non LocalFree ou GlobalFree. La mémoire allouée avec GlobalAlloc ou LocalAlloc doit être interrogée, validée et publiée avec la fonction globale ou locale correspondante.
La fonction VirtualAlloc vous permet de spécifier des options supplémentaires pour l’allocation de mémoire. Toutefois, ses allocations utilisent une granularité de page, de sorte que l’utilisation de VirtualAlloc peut entraîner une utilisation plus élevée de la mémoire.
La fonction malloc présente l’inconvénient d’être dépendante de l’exécution. Le nouvel opérateur présente l’inconvénient d’être dépendant du compilateur et dépendant du langage.
La fonction CoTaskMemAlloc présente l’avantage de fonctionner correctement en C, C++ou Visual Basic. Il s’agit également de la seule façon de partager de la mémoire dans une application COM, car MIDL utilise CoTaskMemAlloc et CoTaskMemFree pour marshaler la mémoire.
Examples
Rubriques connexes