2010-11-27 66 views
0

J'ai une fonction c dans mon projet qui crée une structure et renvoie le pointeur.c problème de fuite de mémoire

typedef struct object 
{ 
float var1; 
float var2; 
} 
Object; 

Object *createObject(float newVar1, float newVar2) 
{ 
Object *object; //create new structure 
object = (Object*)malloc(sizeof(Object)); //malloc size for struct object 
if(object != NULL) //is memory is malloc'd 
{ 
    object->var1 = newVar1; //set the data for var1 
    object->var2 = newVar2; //set the data for var2 
    return object; //return the pointer to the struct 
} 
return NULL; //if malloc fails, return NULL 
} 

maintenant la struct se habitue et après un certain temps que je veux supprimer cette structure, je l'ai fait cette fonction:

void deleteMarnix(Object *objectPointer) 
{ 
free(objectPointer); //free the memory the pointer is pointing to 
objectPointer = NULL; //stop it from becomming a dangling pointer 
} 

ce dernier extrait de code montre comment je fais un objet, l'utiliser et essayer pour le supprimer, cependant, il semble qu'il ne libère pas complètement la mémoire. Qu'est-ce que je fais mal?

Object *object = createObject(21.0f, 1.87f); 
//do things here with object. 
deleteMarnix(object); 
+0

Vous devez montrer comment vous savez qu'il fuit, vous pourriez être voir pré-allocation par le CRT. – Puppy

+0

Que voulez-vous dire par "il semble qu'il ne libère pas complètement la mémoire"? –

Répondre

2

Ce que free() ne libère pas complètement de la mémoire contenue par le pointeur, mais le rend disponible pour un usage ultérieur si nous appelons un malloc après avoir appelé free().

Une preuve à ceci est que vous serez en mesure d'accéder à l'emplacement mémoire après avoir appelé gratuitement et avant de définir le pointeur sur NULL (en supposant que vous n'avez pas déjà appelé malloc()). Bien sûr, les valeurs seront réinitialisées à certaines valeurs par défaut. (Sur certains compilateurs, j'ai trouvé que int était réglé sur 0).

Bien qu'il n'y ait aucune fuite de mémoire, cela peut répondre à votre question.

Faites-nous savoir :)

+0

merci à vous deux, vos messages étaient très utiles! –

3

À partir des extraits que vous avez publiés, il n'y a aucune fuite.

Je pense que avec:

il semble que la mémoire ne

vous voulez dire que object détient toujours la valeur ancienne pas complètement libre.


En deleteMarnix, lorsque vous définissez objectPointer-NULL, vous définissez uniquement la valeur du pointeur dans ce champ de fonction.

Il ne définit pas la valeur du pointeur réel object dans la fonction externe.

Pour ce faire, vous pouvez soit:

  1. ensemble à NULL dans la fonction extérieure

    Object *object = createObject(21.0f, 1.87f); 
    deleteMarnix(object); 
    object = NULL; 
    
  2. passer un pointeur vers un pointeur à votre fonction deleteMarnix:

    void deleteMarnix(Object **objectPointer) 
    { 
        free(*objectPointer); //free the memory the pointer is pointing to 
        *objectPointer = NULL; //stop it from becomming a dangling pointer 
    } 
    ... 
    Object *object = createObject(21.0f, 1.87f); 
    deleteMarnix(&object); 
    
+0

Il devrait toujours être libéré() et ne pas fuir. – Puppy

+0

Correct. C'est seulement la copie du pointeur dans votre dernière portée qui reste comme un "pointeur pendante", mais aucune fuite de mémoire ne se produit. Je recommande également de déclarer 'deleteMarnix' comme recevant' Object ** '. – Kos

+0

Bien sûr, mais ça devient gratuit.Je pense que par "il semble que cela ne libère pas complètement la mémoire", OP signifie que "object" contient toujours l'ancienne valeur. – peoro