риск возврата strdup из функции с типом возврата как char *?

Если я хочу вернуть strdup из функции, тип возвращаемой которой char *, то каковы риски или шансы утечки памяти?

char* fun () {
return strdup("hello");
}

int main() {
for(;;)
printf("%s\n", fun());
}

1

Решение

strdup() возвращает указатель на вновь выделенную память, которая должна быть освобождена позже free(), Вы потеряете память, если не позвоните free() на это — что, в вашем примере, вы не делаете.

2

Другие решения

Вы возвращаете кучу выделенных 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());
1

Со страницы руководства:

Функция strdup () возвращает указатель на новую строку, которая является
дубликат строки s. Память для новой строки получается с
malloc (3) и может быть освобожден с помощью free (3).

так что … strdup выделяет память, которую вы должны освободить, т. е. у вас есть право собственности.

0

Риск косвенный. Если кто-то предупредил вас о его использовании, вероятно, strdup вызывает malloc, и этот вызов явно не виден в исходном коде. Таким образом, теоретически, если кто-то позже реализует свою собственную реализацию malloc и попытается перехватить все выделения, сделанные вашей программой, этот не будет перехвачен.

0
По вопросам рекламы [email protected]