2009-12-20 5 views
1

Visual Studio 2008 - compilation en Clancers francs erreur en essayant de libérer de la mémoire

Je vous écris une application de liste chaînée mais lorsque je tente et libre chaque nœud que je reçois une exception levée. La seule chose que je peux penser est que j'ai alloué ma mémoire dans la fonction d'addition, et peut-être globalement je ne peux pas la libérer dans une autre fonction. Appart de cela je ne peux penser à rien.

Un grand merci pour tous les conseils,

#include <stdio.h> 
#include <stdlib.h> 

static struct convert_temp 
{ 
    size_t cel; 
    size_t fah; 
    struct convert_temp *next; 
} *head = NULL, *tail = NULL; 

=======

/** Add the new converted temperatures on the list */ 
void add(size_t cel, size_t fah) 
{ 
    struct convert_temp *node_temp = NULL; /* contain temp data */ 

    node_temp = malloc(sizeof(node_temp)); 

    if(node_temp == NULL) 
    { 
     fprintf(stderr, "Cannot allocate memory [ %s ] : [ %d ]\n", 
      __FUNCTION__, __LINE__); 
     exit(0); 
    } 

    /* Assign data */ 
    node_temp->cel = cel; 
    node_temp->fah = fah; 
    node_temp->next = NULL; 

    if(head == NULL) 
    { 
     /* The list is at the beginning */ 
     head = node_temp; /* Head is the first node = same node */ 
     tail = node_temp; /* Tail is also the last node = same node */ 
    } 
    else 
    { 
     /* Append to the tail */ 
     tail->next = node_temp; 
     /* Point the tail at the end */ 
     tail = node_temp; 
    } 
} 

=====

/** Free all the memory that was used to allocate the list */ 
void destroy() 
{ 
    /* Create temp node */ 
    struct convert_temp *current_node = head; 

    /* loop until null is reached */ 
    while(current_node) 
    { 
     struct convert_temp *next = current_node->next; 
     /* free memory */ 
     free(current_node); 
     current_node = next;  
    } 

    /* Set to null pointers */ 
    head = NULL; 
    tail = NULL; 
} 
+1

Notez qu'il s'agit d'un idiome bien appris: 'T * a = malloc (size * sizeof * a);' Cela survit au changement de type dans 'a', alloue la bonne quantité de l'espace, et est facile à lire. –

Répondre

12

node_temp = malloc(sizeof(node_temp)); alloue la taille d'un struct pointer au lieu de struct, vous devriez utiliser sizeof(*node_temp).

+0

+1 parce que vous pouvez taper plus vite que moi :-) – paxdiablo

5

Cette ligne n'attribue pas la bonne quantité de mémoire:

node_temp = malloc(sizeof(node_temp)); 

Il devrait plutôt être le suivant:

node_temp = malloc(sizeof *node_temp); 
3

Change:

node_temp = malloc(sizeof(node_temp));

à:

node_temp = malloc(sizeof(struct convert_temp));

et cela fonctionnera. sizeof(node_temp) est la taille d'un pointeur (très probablement 4 ou 8 octets); vous voulez allouer la taille de la structure

Questions connexes