Использование malloc и бесплатных оболочек - PullRequest
2 голосов
/ 04 февраля 2011

Может кто-нибудь подсказать, как освободить память, выделенную внутри функции, отличной от main (например, mymalloc () в приведенном ниже примере)?Работает ли вызов, свободный от другой функции в программе?Или, поскольку мы распределили память в myalloc (), нужно ли ее освобождать внутри самой myalloc ()?Пожалуйста, предложите, если есть лучший способ реализовать следующее.


int main(int argc, char ** argv) {
  int * arr = {0};

  foo();
  return 1;
}

void mymalloc(int ** myarr1 ) {
  (*myarr1) = (int*) malloc( sizeof(int)*25 );
  (*myarr1)[3] = 69;
}

void myfree(int ** myarr2 ) {
   if (*myarr2) {
    memset(*myarr2, 0, sizeof(int)*25 );
    free(*myarr2);
}

void foo() {
  int * arr1 = {0};

  mymalloc(&arr1);
  printf("car[3]=%d\n",arr1[3]);
  myfree (&arr1);

  // Check if memory was freed
  if (arr1) {
  printf("ERROR: Memory allocated to arr1 is not freed.");
  exit (1);
  }
}

Вывод:
ОШИБКА: память, выделенная для arr1, не освобождена.

Ответы [ 3 ]

2 голосов
/ 04 февраля 2011

Вы можете free все, что вы создали с помощью malloc в любом месте программы.

Память, выделенная с помощью malloc, поступает из раздела памяти «куча» и будет сохраняться в течение всей жизнипрограмма, если она не выпущена с free.

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

Нет необходимости вызывать malloc и free в одной и той же функции, но у меня есть некоторые замечания по вашему коду:

  1. Зачем использовать отдельные функции?
  2. memset в myfree бесполезен, указатель все равно недействителен.
  3. Назначение указателей {0} бесполезно, потому что malloc все равно перезапишет их.
0 голосов
/ 21 августа 2013

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

, поэтому вы всегда должны устанавливать указатель на ноль сразу после его освобождения

...