Как работает auto-free (), когда я использую такие функции, как mktemp ()? - PullRequest
1 голос
/ 10 февраля 2011

Привет,

Я использую mktemp() (iPhone SDK), и эта функция возвращает char * новому имени файла, где все буквы "X" заменяются случайными буквами.

Меня смущает тот факт, что возвращаемая строка автоматически free() d.Как (и когда) это происходит?Я сомневаюсь, что это как-то связано с циклом событий Какао.Это автоматически освобождается ядром?

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

mktemp просто изменяет буфер, который вы передаете, и возвращает тот же самый указатель, который вы передаете, лишнего буфера для освобождения нет.

Это как минимум OSX manpage описывает его (я не смог найти документацию для IPhone) и man-страницу posix (хотя пример в posix manpage выглядит неправильно, так как он передает указатель на строковый литерал - возможно, старыйОстаток, функция также помечена как устаревшая - используйте вместо этого mkstemp. На странице OSX специально упоминается, что это ошибка).

Итак, вот что произойдет:

char template[] = "/tmp/fooXXXXXX";
char *ptr;
if((ptr = mktemp(template)) == NULL) {
   assert(ptr == template); //will be true, 
                           // mktemp just return the same pointer you pass in
}
2 голосов
/ 10 февраля 2011

Если это похоже на функцию cygwin с тем же именем, то она возвращает указатель на внутренний статический буфер символов, который будет перезаписан при следующем вызове mktemp (). В cygwin на справочной странице mktemp конкретно упоминается _mktemp_r () и аналогичные функции, которые гарантированно реентерабельны и используют предоставленный вызывающим буфер.

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