2016-11-24 1 views
-1

donc je suis en train d'optimiser le managment de ma mémoire dans mon code.malloc et free dans les fonctions (mémoire) Optimisation

Voici un échantillon du code:

Image image; 

    int main(int argc, char *argv[]) 
    { 

    image = (Image) malloc(sizeof (struct image)); 

    image = doSomething(image); 


    } 

    Image doSomething(Image imageInput) { 
    Image imageResult; 

    imageResult = (Image) malloc(sizeof (struct image)); 

    //Code does something here 

    return imageResult; 

    } 

Quand est-il approprié d'utiliser le libre(); dans mon exemple?

Image image; 

int main(int argc, char *argv[]) 
{ 

image = (Image) malloc(sizeof (struct image)); 

image = doSomething(image); 


free(image); 
} 

Image doSomething(Image imageInput) { 
Image imageResult; 

imageResult = (Image) malloc(sizeof (struct image)); 

//Code does something here 

free(imageInput); 
return imageResult; 

} 

La seule fois que je peux voir est la variable « imageInput » qui est censé arriver à copier dans la fonction et est supposé être effacé après que la fonction se termine.

Est-il exagéré de libérer une variable de fonction?

Et à la fin de l'exécution de l'application aussi.

+0

Vous * ne peut pas * 'free' une variable de fonction: vous ne pouvez' mémoire free' qui a été attribué à la famille 'malloc' des fonctions. La vie des variables de fonction se termine lorsque vous quittez la fonction de toute façon. –

+1

[Veuillez vous reporter à cette discussion sur pourquoi ne pas convertir la valeur de retour de 'malloc()' et de la famille dans 'C'.] (Http://stackoverflow.com/q/605845/2173917). –

+1

En définissant (vraisemblablement) un pointeur sur votre image en tant que type, vous avez rendu peu clair ce que vous allouez, et combien. 'image = (Image) malloc (sizeof (struct image)); 'semble louche, puisque vous avez utilisé' image' * et * 'struct image' et il n'est pas clair si vous allouez juste assez de mémoire pour un' pointeur'. C'est une mauvaise pratique de définir les types de pointeurs. –

Répondre

0

Vous devez faire des conventions sur l'utilisation de votre classe de fonctions qui fonctionnent avec les images. Je ne pense pas que votre exemple soit mauvais. Mais je pense que tu peux faire mieux.

Il est seul exemple, mais je pense que vous pouvez faire quelque chose comme ça:

struct image *img_alloc() 
{ 
    return malloc(sizeof(struct image)); 
} 

void img_free(struct image **a) 
{ 
    free(*a); 
    *a = NULL; 
} 

struct image **img_add(struct image **dstp, struct image const *lhs, struct image const *rhs) 
{ 
    struct image *dst = img_alloc(); 
    ... 
    img_free(dstp); 
    *dstp = dst; 
    return dstp; 
} 

int main(int argc, char *argv[]) 
{ 
    struct image *img = NULL; 
    ... 
    img_add(&img, a, b); 
    ... 
    img_add(&img, img, c); 
    ... 
    img_add(&img, *img_add(&img, img, a), b); 
    ... 
    img_free(&img); 

    return 0; 
} 
0

Enfin j'ai utilisé valgrind pour analyser les fuites de mémoire.

Assez utile pour guider quelqu'un dans cette tâche. M'a aidé à apprendre quand faire un free() et où.

Voici un lien utile: Valgrind website