2016-04-17 11 views
-1

Ich habe eine benutzerdefinierte struct mystruct.Speicherverlust mit Valgrind in c

typedef struct mystruct 
{ 
    int data; 
    struct mystruct * parent; 
    struct mystruct * child; 
    struct mystruct * next; 
}mystruct; 

Jetzt habe ich Nachordnungsdurchquerung dieser mystruct in einer Funktion tue traverse()

mystruct * create(mystruct * root) 
{ 
    mystruct * newNode=malloc(sizeof(mystruct)); 
    //change some pointers like make newNode->parent=root->parent 
    // 
    // 
    return newNode; 
} 

void traverse(mystruct * root) 
{ 
if(root==NULL) 
    return; 

//here I am calling a new function 
if() // somecondition 
{ 
    mystruct * newNode=create(root); 
    root=NULL; 
    free(root); 
    root=newNode; 
} 


traverse(root->child); 
traverse(root->next); 

} 

void delete(mystruct * root) 
{ 
    if(root==NULL) 
     return; 

    delete(root->child); 
    delete(root->next); 
    free(root); 
} 

Auch nach meiner Struktur am Ende freigegeben werden kann, zeigt valgrind Gedächtnisverlust aufgrund newNode geschaffen. Wie kann ich diese Speicherverluste entfernen?

Antwort

4

Es ist nicht ganz klar, ohne voll valgrind Ausgang, aber hier:

root=NULL; free(root); root=newNode;

Sie NULL root zugewiesen, dann NULL Sie befreien, was völlig sinnlos ist, und neue Zeiger auf root zuweisen. Der alte Wert des Wurzelzeigers ist verloren und Sie haben keine Möglichkeit, diesen Speicher freizugeben. Ziehen Sie in Betracht, root=NULL zu entfernen.

Verwandte Themen