Возврат выделенной переменной
Я знаю, что мы должны освободить любую переменную, выделенную malloc, но что, если я верну ее в функцию? Что-то вроде этого:
char *somefunction(int somearg){
char *str;
str=(char *)malloc(sizeof(char *));
//some code
return str;
}
Должен ли я освободить str? Как я могу это сделать?
Ответы
Ответ 1
У вас есть два варианта: один, передать char * в какую-то функцию и использовать это вместо выделения внутри некоторой функции или двух, освободите возвращаемое значение позже.
Первый вариант:
char *somefunction(char *str, int somearg){
//some code
return str;
}
// Elsewhere...
char *str = (char *) malloc....;
somefunction(str, 123);
// Code...
free(str);
Второй вариант:
char *somestr = somefunction(123);
// Do something...
free(somestr);
Я лично предлагаю первый вариант, так как немного легче избежать утечки памяти, когда он не выделяется в рамках суровых функций.
Ответ 2
Вы освободите его, когда закончите с ним. Не существует правила, согласно которому free(), который соответствует malloc(), должен быть в той же функции.
Ответ 3
Вы должны освободить все выделенное пространство, но если вы вернете его, потому что вы будете использовать это пространство памяти в других частях программы, поэтому после его использования вы должны освободить. Смотрите все места в коде, вызывающем функцию, и освободите место после использования возвращаемого значения.
Ответ 4
Если вы намерены вернуть адрес блока, вы не должны освобождать() блок, а вместо этого полагаться на вызывающий код, чтобы освободить() его позже. Это называется передачей полномочий.
Если вы освободите его в функции и вернете указатель, вызывающий код будет запущен в поведение undefined, пытаясь получить доступ к уже освобожденному блоку.
Ответ 5
Это практика для некоторых существующих функций (например, strdup()
), но, как правило, это плохая идея. Требование, чтобы пользователь знал о том, что происходит внутри вызова функции, является плохим требованием - подумайте, сколько функций вы используете, какие внутренние лица скрыты от вас.
Вообще говоря, вы захотите, чтобы пользователь пропускал в буфере и размере вместо распределения памяти для них.