int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
memory=10;
free(memory);
}
Cela va planter. Vous définissez le pointeur sur l'emplacement de mémoire 10, puis demandez au système de libérer la mémoire. Il est extrêmement improbable que vous ayez précédemment alloué de la mémoire qui est arrivé à 0x10, même dans le monde fou des espaces d'adresses virales. En outre, SI malloc a échoué, aucune mémoire n'a été allouée, vous n'avez donc pas besoin de le libérer.
int* memory = NULL;
memory = malloc(sizeof(int));
if (memory != NULL)
{
memory=10;
}
free(memory);
Ceci est également un bug. Si malloc échoue, vous placez le pointeur sur 10 et libérez cette mémoire. (comme avant.) Si malloc réussit, alors vous libérez immédiatement la mémoire, ce qui signifie qu'il était inutile de l'allouer! Maintenant, j'imagine que c'est juste un exemple de code simplifié pour faire passer le message, et que ce n'est pas présent dans votre vrai programme? :)
Ne vous dire « si la déclaration » plutôt que « en boucle » – ChrisF
Be Assurez-vous d'écrire les fonctions wrapper pour 'malloc' et' free'. Ainsi, si vous souhaitez modifier l'implémentation sous-jacente (par exemple, utiliser une fonction d'allocation de mémoire plus rapide), seules deux lignes doivent être modifiées (les lignes pour 'malloc' et' free'). Et cela vous permettra d'éviter la duplication de code. –