MALLOC |
Allocation mémoire |
---|---|
Langage C++ | cstdlib (stdlib.h) |
Syntaxe
void *malloc(size_t n) |
Paramètres
Nom | Description |
---|---|
n | Ce paramètre permet d'indiquer la quantité de mémoire en octets |
Description
Cette fonction une allocation de mémoire dynamique de «n» octets.
Remarques
- La fonction malloc() renvoie un pointeur sur le premier octet d'une région de mémoire de taille n ayant été allouée à partir du tas. S'il n'y a pas suffisamment de mémoire dans le tas pour satisfaire la demande, malloc() renvoie un pointeur null. Il est toujours important de vérifier que la valeur de retour n'est pas null avant de tenter de l'utiliser. Tenter d'utiliser un pointeur null entraînera généralement un plantage du système.
- Définition et utilité : La fonction malloc fait partie de la bibliothèque <cstdlib> (ou <stdlib.h> en C) et est utilisée pour allouer dynamiquement de la mémoire à l'exécution. Elle prend un paramètre : la taille (en octets) de la mémoire à allouer, et retourne un pointeur sur cette mémoire allouée. Cette fonction est couramment utilisée dans les programmes nécessitant une gestion flexible de la mémoire, comme dans les structures de données dynamiques ou les applications nécessitant une allocation conditionnelle.
- Usage de la mémoire allouée : La mémoire allouée par malloc n'est pas initialisée ; elle contient des données aléatoires laissées par d'autres processus. Cela signifie qu'après l'appel à malloc, les valeurs contenues dans la mémoire sont indéterminées et doivent être explicitement initialisées si nécessaire. Si vous souhaitez une mémoire initialisée, il est préférable d'utiliser calloc, allouant de la mémoire et l'initialise à zéro.
- Gestion de la mémoire : Une fois que la mémoire est allouée avec malloc, il est de la responsabilité du programmeur de libérer cette mémoire en utilisant la fonction free. Négliger d'appeler free peut entraîner des fuites de mémoire, où la mémoire allouée n'est jamais libérée, ce qui peut entraîner une consommation excessive de ressources système et une dégradation des performances du programme à long terme.
- Comparaison avec new en C++ : En C++, la fonction malloc est une fonction de la bibliothèque C, et bien qu'elle soit utilisée pour allouer de la mémoire, elle n'appelle pas le constructeur de la classe si vous allouez de la mémoire pour un objet. En revanche, l'opérateur new en C++ alloue de la mémoire et appelle automatiquement le constructeur de l'objet. Par conséquent, dans les programmes C++, il est généralement recommandé d'utiliser new et delete pour l'allocation et la libération de mémoire, car ils respectent mieux la sémantique orientée objet.
- Problèmes d'alignement : Lors de l'utilisation de malloc, il peut y avoir des problèmes d'alignement de la mémoire. La mémoire allouée peut ne pas être correctement alignée pour certains types de données, ce qui peut entraîner des problèmes de performance ou même des erreurs d'exécution sur certaines architectures. Cela peut être particulièrement problématique lors de l'allocation de grandes structures de données ou de types nécessitant un alignement spécifique. Pour garantir un bon alignement, certaines bibliothèques ou fonctions spécifiques peuvent être utilisées (par exemple, posix_memalign sur les systèmes POSIX).
- Échecs d'allocation et gestion d'erreurs : Si malloc échoue, elle retourne un pointeur nul (nullptr). Il est donc important de vérifier si l'allocation a réussi avant de tenter d'utiliser la mémoire allouée. Par exemple :
- Incompatibilité avec des types complexes : malloc alloue de la mémoire brute sans connaître les types spécifiques, ce qui peut entraîner des problèmes lorsque vous l'utilisez pour des types complexes (par exemple, des objets avec des constructeurs ou des destructeurs). Par exemple, utiliser malloc pour allouer de la mémoire pour un objet d'une classe en C++ ne permettra pas d'appeler son constructeur. Pour ces cas, il est préférable d'utiliser new gérant correctement la construction des objets et leur destruction.
Dans ce cas, le programme affiche un message d'erreur et termine son exécution si l'allocation échoue. La gestion des erreurs d'allocation est cruciale pour garantir la stabilité du programme.
Exemple
Voici quelques exemples typiques de l'utilisation de cette fonction :

- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
-
- int main()
- {
- int * p = (int *) malloc(20 * sizeof(int));
- if(NULL != p) {
- int I;
- for(I = 0; I < 20; I++) {
- p[I] = 1000-(I * 10);
- }
- std::cout << "Valeur p[15] = " << p[15] << std::endl;
- free(p);
- } else {
- std::cout << "Impossible d'allouer de la mémoire dynamiquement !" << std::endl;
- }
- return 0;
- }
on obtiendra le résultat suivant :
Valeur p[15] = 850Voir également
Langage de programmation - C++ - Référence de procédures et fonctions - calloc
Langage de programmation - C++ - Référence de procédures et fonctions - free
Langage de programmation - C++ - Référence de procédures et fonctions - realloc
Langage de programmation - C - Référence de procédures et fonctions - malloc
Références
Langage C, Edition Micro-Application, Gehard Willms, 2001, ISBN: 2-7429-2008-0, page 733.
Borland C++ for Windows 4.0, Library Reference, Edition Borland, 1993, Part # BCP1240WW21772, page 169.