Освобождает ли подобный выход за пределы области памяти связанную с этим память? - PullRequest
3 голосов
/ 24 августа 2009

Мне просто интересно, в следующем сценарии освобождается ли память, используемая 'stringvar', после завершения метода method1?

// Just some method
void method2(char* str)
{
  // Allocate 10 characters for str
  str = malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  method2(stringvar);

  // Is the memory freed hereafter, or do I need to call free()?
}

Я спрашиваю, потому что, если я ставлю 'free (stringvar)' в конце method1, я получаю предупреждение, что stringvar унифицируется внутри method1 (что верно).

Ответы [ 6 ]

22 голосов
/ 24 августа 2009

Нет, память не освобождена после method1, поэтому у вас будет утечка памяти. Да, вам нужно будет позвонить free после того, как вы закончите использовать память.

Вам нужно отправить указатель на указатель на method2, если вы хотите, чтобы он выделил память. Это распространенная идиома в программировании на C, особенно когда возвращаемое значение функции зарезервировано для целочисленных кодов состояния. Например,

void method2(char **str) {
    *str = (char *)malloc(10);
}

char *stringvar;
method2(&stringvar);
free(stringvar);
5 голосов
/ 24 августа 2009

Нет, динамически выделенная память не освобождается автоматически. В Си это ответственность программистов за освобождение.

Также - C передает переменные по значениям, str = malloc (10 * sizeof (char)); просто присваивает локальную переменную 'str'.

Похоже, вы хотите вернуть указатель, полученный из malloc, поэтому ваша программа становится:

char *method2(void)
{
  // Allocate 10 characters for str
  return malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  stringvar = method2();
  ...
  free(stringvar);
}

Другой вариант, если вы хотите манипулировать 'stringvar' из метода method2, это передать указатель на 'stringvar', например

void method2(char** str)
{
  // Allocate 10 characters for str
  *str = malloc(10 * sizeof(char));
}

// Just another method
void method1()
{
  char* stringvar;
  method2(&stringvar);
  ...
  free(stringvar);
}
2 голосов
/ 24 августа 2009

Мало того, что stringvar не инициализирован внутри метода 1, но и выделение памяти для него внутри метода 2, как вы делаете, является ошибочным. Вы изменяете копию указателя внутри method2, но это не влияет на копию указателя в method1. Вам нужно будет использовать двойной указатель, чтобы stringvar в method1 указывал на память, выделенную method2.

0 голосов
/ 24 августа 2009

Вы должны использовать бесплатно ()

0 голосов
/ 24 августа 2009

Нет, вам нужно позвонить free () самостоятельно. Попробуйте поставить char * stringvar = 0; подавить предупреждение.

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