Ошибка свободного броска при попытке освободить память - PullRequest
1 голос
/ 20 декабря 2009

Visual Studio 2008 - компиляция в C

Я пишу приложение со связанным списком, но когда я пытаюсь освободить каждый узел, я получаю исключение. Единственное, о чем я могу думать, - это то, что я выделил свою память в функции добавления, и, возможно, я не могу освободить ее в другой функции. Судя по всему, я ни о чем не могу думать.

Большое спасибо за любой совет,

#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;
}

Ответы [ 3 ]

12 голосов
/ 20 декабря 2009

node_temp = malloc(sizeof(node_temp)); выделяет размер структурного указателя вместо структуры, вы должны использовать sizeof(*node_temp).

5 голосов
/ 20 декабря 2009

Эта строка не выделяет правильный объем памяти:

node_temp = malloc(sizeof(node_temp));

Вместо этого должно быть:

node_temp = malloc(sizeof *node_temp);
3 голосов
/ 20 декабря 2009

Изменение:

node_temp = malloc(sizeof(node_temp));

до:

node_temp = malloc(sizeof(struct convert_temp));

и это будет работать. sizeof(node_temp) - размер указателя (скорее всего 4 или 8 байт); Вы хотите выделить размер структуры

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...