Выделение недавно освобожденной памяти - PullRequest
1 голос
/ 19 июля 2011

У меня есть структура, которую я использую для создания связанного списка, как показано ниже;

struct my_struct{
    char a[16];
    struct my_struct *next;
}

Я освобождаю этот связанный список функцией ниже;

void free_my_list(struct my_struct* recv) {

     if (recv->next != NULL)
         free_my_list(recv->next);

     free(recv);
     recv = NULL;
}

В моей программе я использую struct _my_list снова и снова, но бесплатно и malloc каждый раз, как показано ниже:

struct my_struct *_my_list;

free_my_list(_my_list);
_my_list = (my_list *) malloc(sizeof(my_list));
_my_list->next = NULL;

Каждый раз, когда я заполняю список, я печатаю массивы символов, а затем сбрасываю _my_struct по указанному выше коду. Приведенный выше код отлично работает на ПК с Ubuntu, но в Cent OS после правильной печати первого списка (после первого malloc _my_struct) следующий список печатается как поврежденные данные.

Когда я не освобождаю и не размещаю память во время выполнения всей программы, она хорошо работает и в Cent OS, но я должен сбросить список _my_list между printf() вызовами.

_my_list заполняется и печатается с помощью следующих функций;

/*prints every item in my_list*/
void print_my_list(struct my_struct *recv, FILE *fd) {

   my_list *tmp;
   tmp = recv;

   while (tmp != NULL) {
       if (fwrite(tmp->a, 1, strlen(tmp->a), fd) == -1) {
               pritnf("error\n");
        }
       tmp = tmp->next;
   }
}

/*Add 'a' string to _my_list*/
void add_recv_to_list(struct my_struct **recv_list, char *recv) {

struct my_struct *tmp;
tmp = *recv_list;

if (*recv_list == NULL) {
    *recv_list = (struct my_struct *) malloc(sizeof(struct my_struct));
    tmp = *recv_list;

} else {

    while ((tmp->next) != NULL) {
        tmp = tmp->next;
    }
    tmp->next = (struct my_struct *) malloc(sizeof(struct my_struct));
    tmp = tmp->next;

}
strncpy(tmp->a, recv, MAX_NAME_LEN);
tmp->next = NULL;
}

В чем может быть причина, есть идеи?

1 Ответ

1 голос
/ 19 июля 2011

Я думаю, что ваша проблема может начаться здесь:

struct my_struct *_my_list;

free_my_list(_my_list);
_my_list = (my_list *) malloc(sizeof(my_list));
_my_list->next = NULL;

Когда вы инициализируете struc: struct my_struct *_my_list;, вы не присваиваете ему никакого значения, поэтому оно хранит все данные мусора, которые были в памяти заранее.Когда вы free() указываете на то, что в free_my_list поведение не определено (вы освобождаете то, что никогда не malloc() редактируете - так что в результате вы вполне можете испортить то или иное позже. Попробуйте изменить объявление на: struct my_struct *_my_list = NULL;(во всяком случае, всегда полезно инициализировать указатели в NULL) и изменить функцию free_my_list на:

void free_my_list(struct my_struct* recv) {
    if (recv == NULL)
         return;

     if (recv->next != NULL)
         free_my_list(recv->next);

     free(recv);
     recv = NULL;
}
...