Срок службы памяти, выделенной функцией malloc () - PullRequest
0 голосов
/ 31 декабря 2018

Если я передам функции указатель, в котором указатель получает адрес для выделенной памяти, освобождается ли память при выходе из функции?

void initWomenList(Women **head, Women *headWoman) {        
  headWoman = (Women *) malloc(sizeof(Women));
  if (headWoman == NULL) {
      printf("Allocation of headWoman failed\n");
      exit(1);
  }
  headWoman->userWoman = NULL;
  headWoman->next = NULL;

  head = &headWoman;
}

При возвращении функции head и headWoman равны NULL?

1 Ответ

0 голосов
/ 31 декабря 2018

Не существует автоматического освобождения памяти (иногда называемого сборщик мусора ) на языке Си.Любая память, выделенная с помощью malloc/calloc/realloc, должна быть вручную освобождена с использованием функции free.

Все параметры функции на языке C передаются по значению, таким образом, присвоение headWomen внутренней функции не имеет никакого эффекта снаружи, и в настоящее время у вас есть утечка памяти , поскольку ни один указатель не удерживает выделенную память.

void
alloc_mem(int* a) {
    a = malloc(sizeof(*a));
}

//usage in your case
int* a;
//Function will allocate memory for single int, but it won't be saved to variable a.
alloc_mem(a);

Лучше использовать указатель-на-указатель или вернуть указатель изfunction.

int*
alloc_mem() {
    return malloc(sizeof(int));
}

//usage
int* a = alloc_mem();
if (a != NULL) {
    //Check if null
}

Или с указатель-указатель подход

void
alloc_mem(int** a) {
    *a = malloc(sizeof(**a));
}

//usage
int* a;
alloc_mem(&a);
if (a != NULL) {
    //Do the job.
}

В конце всех этих операций всегда вызывайте free function

free(a);

Если я вернусь к исходному примеру, вам нужно переписать функцию примерно так:

void 
//Notice here **headWoman instead of *headWoman
initWomenList(Women **head, Women **headWoman) {  
  //Notice here *headWoman instead of headWoman      
  *headWoman = malloc(sizeof(Women));
  if (headWoman == NULL) {
      printf("Allocation of headWoman failed\n");
      exit(1);
  }
  headWoman->userWoman = NULL;
  headWoman->next = NULL;

  //Notice here *head instead of head
  *head = &headWoman;
}

И использование:

Woman* headWoman;
Woman* head;

initWomenList(&head, &headWoman);
//Don't forget to free memory after usage.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...