URL: https://linuxfr.org/users/tchetch/journaux/realloc Title: realloc Authors: Etienne Bagnoud Date: 2012年09月07日T16:38:54+02:00 License: CC By-SA Tags: c et realloc Score: 13 Sur mon netbook avec 1Go de RAM, je déteste particulièrement les programmes qui bouffent de la mémoire dans le vide. Et quand un [programme qui affiche la date, le niveau de batterie et deux trois autres informations](http://conky.sourceforge.net/) mangent 4 fois plus que ce qu'utilise xmonad, je suppose un problème. Je récupère le code source et je regarde. Du C qui est du C++ ou le contraire, mais bon, passons. Je n'ai pas prévu de faire la moindre correction au code. Je regarde juste ... et je m'étrangle sur les deux lignes suivantes : ```c /* ... */ src_dup = (char*) realloc(src_dup, dup_len * sizeof(char)); sprintf(src_dup + dup_idx, "%s", templates[tmpl_num - 1]); /* ... */ ``` Si on lit la page de man de realloc : ``` void *realloc(void *ptr, size_t size); [...] The realloc() function returns a pointer to the newly allocated memory, which is suitably aligned for any kind of variable and may be different from ptr, or NULL if the request fails. If size was equal to 0, either NULL or a pointer suitable to be passed to free() is returned. If realloc() fails the original block is left untouched; it is not freed or moved. ``` Une utilisation correcte de realloc en C devrait ressembler à ça : ```c /* ... */ tmp=realloc(ptr, new_size); if(tmp!=NULL) { ptr=tmp; /* ... */ } ``` Si la ré-allocation n'est pas possible, `NULL` est retourné. Ensuite le pointeur retourné peut être différent de celui passé en paramètre, il est donc nécessaire d'assigner la valeur retournée au bon pointeur. Vous me croyez pas ? La [FAQ C](http://c-faq.com/malloc/realloc.html) ne laisse aucun doute. Voilà, c'est tous ce que j'avais à dire. Et puisqu'il semble qu'il ait une tradition qui fasse grincer des dents, voici quelque chose [en rapport avec le journal](http://www.thelivingmoon.com/43ancients/04images/India/NuclearBomb.jpg). PS: Il faudrait que je patch les 15 realloc de conky, mais comme je sais pas si c'est du C ou du C++, je sais pas si je vais le faire.

AltStyle によって変換されたページ (->オリジナル) /