REALLOC |
Réallouer |
---|---|
Langage C++ | cstdlib (stdlib.h) |
Syntaxe
void *realloc(void *tampon,size_t taille) |
Paramètres
Nom | Description |
---|---|
tampon | Ce paramètre permet d'indiquer le tampon contenant l'expression à réallouer |
taille | Ce paramètre permet d'indiquer la nouvelle taille du tampon |
Description
Cette fonction permet de changer la taille d'un bloc de mémoire dynamique.
Remarques
- La fonction realloc() change la taille de la mémoire précédemment allouée pointée par tampon à celle spécifiée par taille. La valeur de la taille peut être supérieure ou inférieure à l'original. Un pointeur vers le bloc de mémoire est renvoyé car il peut être nécessaire pour realloc() de déplacer le bloc afin d'augmenter sa taille. Si cette situation se produit, le contenu de l'ancien bloc est copié dans le nouveau bloc - aucune information n'est perdue.
- Si tampon est null, alors la fonction realloc() alloue simplement des octets de taille de mémoire et lui renvoie un pointeur. Si la taille est nulle, la mémoire pointée par tampon est libérée.
- S'il n'y a pas assez de mémoire libre dans le tas pour allouer des octets de taille, un pointeur null est renvoyé et le bloc d'origine reste inchangé.
- Définition et utilité : La fonction realloc est définie dans la bibliothèque <cstdlib> (ou <stdlib.h>) et permet de redimensionner un bloc de mémoire précédemment alloué avec malloc ou calloc. Elle est utile lorsque vous souhaitez ajuster la taille d'un tableau dynamique pendant l'exécution du programme sans avoir à allouer un nouveau bloc de mémoire et à recopier manuellement les données.
- Comportement en cas de redimensionnement : Si le nouveau bloc de mémoire peut être obtenu à partir du bloc d'origine (sans déplacement), realloc ajustera simplement la taille du bloc. Si le bloc doit être déplacé en raison de la nécessité d'allouer plus d'espace ou de libérer de l'espace, realloc allouera un nouveau bloc de mémoire à un autre emplacement et copiera les données depuis l'ancien bloc vers le nouveau. Dans ce dernier cas, le pointeur d'origine devient invalide.
- Risques liés à l'échec de realloc : Si realloc échoue (par exemple, en raison d'un manque de mémoire disponible), elle retourne NULL et ne modifie pas le bloc mémoire original. C'est à l'appelant de gérer cette situation, souvent en vérifiant que la valeur retournée n'est pas NULL avant de procéder. Dans certains cas, cela peut entraîner une perte de données si l'on n'a pas pris les précautions nécessaires (comme entreposer temporairement l'adresse retournée par realloc).
- Gestion de la mémoire avec realloc : Contrairement à malloc ou calloc, realloc peut être utilisée pour ajuster dynamiquement la taille d'un bloc de mémoire alloué. Il est important de noter qu'une fois que realloc réussit, le bloc d'origine devient invalide et le pointeur initial doit être mis à jour pour pointer vers le nouveau bloc. De plus, il est fortement recommandé de ne pas appeler realloc directement sur le même pointeur dans une expression complexe, car cela pourrait entraîner des comportements indéfinis si realloc échoue.
- Sécurité du code : Pour éviter des erreurs de gestion de mémoire, il est préférable de stocker le résultat de realloc dans un nouveau pointeur temporaire et de vérifier si l'allocation a échoué avant de procéder à toute manipulation des données :
- Effet sur les pointeurs nuls : Si le pointeur passé à realloc est NULL, la fonction se comporte de manière similaire à malloc. Elle alloue un nouveau bloc de mémoire de la taille spécifiée. Cela signifie que vous pouvez appeler realloc sur un pointeur nul pour allouer de la mémoire, mais il est recommandé d'utiliser directement malloc ou calloc dans ce cas pour une meilleure lisibilité du code.
- Portabilité et performance : L'utilisation de realloc est largement supportée et portable, mais l'implémentation et le comportement précis de l'allocation peuvent varier selon les plateformes et les systèmes d'exploitation. Sur certaines plateformes, realloc peut avoir des optimisations spécifiques, par exemple, en réutilisant la mémoire sous-jacente si le redimensionnement ne nécessite pas un déplacement de bloc. Cependant, dans certains cas, comme un redimensionnement fréquent ou important, realloc peut être coûteuse en termes de performance, car elle peut impliquer des copies de données et des ajustements de la gestion mémoire.
Cette approche empêche la perte de référence vers l'ancien bloc mémoire si realloc échoue.
Voir é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 - malloc
Langage de programmation - C - Référence de procédures et fonctions - realloc
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 209.
Dernière mise à jour : Lundi, le 3 août 2015