Если я хочу вернуть strdup из функции, тип возвращаемой которой char *, то каковы риски или шансы утечки памяти?
char* fun () {
return strdup("hello");
}
int main() {
for(;;)
printf("%s\n", fun());
}
strdup()
возвращает указатель на вновь выделенную память, которая должна быть освобождена позже free()
, Вы потеряете память, если не позвоните free()
на это — что, в вашем примере, вы не делаете.
Вы возвращаете кучу выделенных char
Указатель как значение, так что пользователь может забыть освободить его, как видно из приведенного вами примера.
printf("%s\n", fun()); // memory leak
// this is fine
char* string = fun();
printf("%s\n", string);
free(string);
Лучше попросить указатель на char*
в параметре и выделил его.
Если вы действительно хотите вернуть такой указатель и используете C ++, вы можете использовать std::unique_ptr<char>
с пользовательским удалителем, который будет free
строка, когда вы закончили с этим.
unique_ptr<char, void (*)(char *)> fun () {
return {strdup("hello"), std::free};
}
// then you can use it
printf("%s\n", &*fun());
Со страницы руководства:
Функция strdup () возвращает указатель на новую строку, которая является
дубликат строки s. Память для новой строки получается с
malloc (3) и может быть освобожден с помощью free (3).
так что … strdup выделяет память, которую вы должны освободить, т. е. у вас есть право собственности.
Риск косвенный. Если кто-то предупредил вас о его использовании, вероятно, strdup
вызывает malloc, и этот вызов явно не виден в исходном коде. Таким образом, теоретически, если кто-то позже реализует свою собственную реализацию malloc и попытается перехватить все выделения, сделанные вашей программой, этот не будет перехвачен.