В программировании C и использовании mallo c, где функция free () в функции указателя, которая возвращает указатель? - PullRequest
0 голосов
/ 15 марта 2020

Я создал функцию указателя, которая возвращает указатель. Я помещаю malloc внутри функции, но тогда я не знаю, нужно ли ставить free() и, если да, если он должен go в функции или main.

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

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

#include <stdio.h>
#include <stdlib.h>


int *fun()
{
     int *ptr=malloc(sizeof(int));

     if(ptr==NULL)
     {
         printf("Error");
         exit(1);
     }

     return ptr;
}

int main()
{
     int*ptr=fun();

     /*do something*/

     /*After all work of ptr is done*/
     free(ptr);

     /*do something*/
}
0 голосов
/ 15 марта 2020

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

int main() {
  //let's start our method with initializing any declarations
  int mystringlen = 25;
  char* mystring1 = NULL;
  char* mystring2 = NULL;

  //let's now assign some data
  mystring1 = malloc(mystringlen * sizeof(char));  
  if (mystring1 == NULL) goto end; //malloc failure :(
  strncpy(mystring1, "Hello world", mystringlen);

  //strdup(3) mallocs its return value, we should be careful and check
  //documentation for such occurances
  mystring2 = strdup("hello world");
  if (mystring2 == NULL) goto end; //malloc failure


  //let's do our processing next
  printf("%s\n%s\n", mystring1, mystring2);


  //let's do our cleanup now
  end:
    if (mystring1) free(mystring1);
    if (mystring2) free(mystring2);
    return 0;
}

Есть несколько доступных соглашений, и некоторые могут возражать против использования goto для управления потоком. Обратите внимание, что мы установили наши указатели на NULL, чтобы впоследствии мы могли выполнить безопасную очистку. Мы также проверяем ошибки mallo c, что является хорошей практикой.

...