C - эти функции генерируют мусор? - PullRequest
1 голос
/ 07 февраля 2011

Не думаю, что они это делают, потому что delete использует функцию free () и заменяет только измененные значения, а не создает новые узлы. Я спрашиваю, потому что я пришел с Java, и я новичок в распределении памяти.

IntNodePtr delete(int i, IntNodePtr p) {
  /* End of list check */
  if(p == NULL)
    return NULL;

  /* Check if current node is the one to delete */
  if(p->myInt == i) {
    IntNodePtr temp;
    temp = p->next;

    free(p);
    return temp;
  }

  p->next = delete(i, p->next);
  return p;
}

IntNodePtr replace(int i, int j, IntNodePtr p) {
  if(p == NULL)
    return NULL;

  if(p->myInt == i)
    p->myInt = j;

  p->next = replace(i, j, p->next);
  return p;
}

Ответы [ 4 ]

1 голос
/ 07 февраля 2011

В C мы не называем выделенную память, которая больше не используется, «мусором», а «утечкой памяти».

Вам нужно только free память, которую вы ранее распределили, используя malloc.В этом случае ни одна из ваших функций не вызывает malloc, и, следовательно, им ничего не нужно free.(Хотя функция delete выглядит так, как будто free выделяет память в другом месте программы. Это тоже хорошо.)

1 голос
/ 07 февраля 2011

В delete вы free объект, потому что, как только указатель будет заменен, к нему не будет никакого доступа. Все хорошо там.

В replace объекты изменяются только на месте. Ничто не создано или уничтожено, поэтому malloc и free не участвуют.

Обратите внимание, что эти функции могут вызвать ошибку переполнения стека, если список слишком длинный. Кроме того, replace всегда возвращает свой аргумент p, поэтому ему не нужно ничего возвращать. Оставление хвостового вызова в конце функции вместо p->next = replace( … (почти все) устранит риск переполнения стека. Запись delete в виде цикла также, возможно, будет несколько безопаснее.

0 голосов
/ 07 февраля 2011
  if(p->myInt == i) {
    IntNodePtr temp;
    temp = p->next;

    free(p);
    return temp;
  }

Этот код сомнителен.Что вы делаете с возвращенным указателем?Мне кажется, что вы удаляете узел в середине связанного списка, не заботясь о предыдущем «следующем указателе».После удаления p предыдущий следующий указатель будет указывать на недопустимую память.Т.е. вы отсекаете список посередине.

0 голосов
/ 07 февраля 2011

В C "мусор" генерируется, когда вызывается free, в C нет "сборки мусора"; если это не было реализовано - извините, если я констатирую очевидное! Таким образом, удаление будет генерировать «мусор» - относительно замены ваше наблюдение верно.

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