2014-09-30 4 views
3

Я хочу использовать функцию POSIX basename (в отличие от GNU).Должен ли я освобождать указатель strdup после basename/dirname в C?

От человека страницы:

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

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

Он также говорит:

ВОЗВРАТ СТОИМОСТЬ
Оба имя_директории() и() базовый возвращают указатели на нуль-терминатор строки. (Не пропустите эти указатели, чтобы освободить (3).)

Так пример показывает, что-то вроде:

Пример

 char *dirc, *basec, *bname, *dname; 
     char *path = "/etc/passwd"; 

     dirc = strdup(path); 
     basec = strdup(path); 
     dname = dirname(dirc); 
     bname = basename(basec); 
     printf("dirname=%s, basename=%s\n", dname, bname); 

strdup (strndup) man page говорит:

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

Так что вопрос: Должен ли я свободно DIRC и BASEC (в соответствии с strdup) или нет (как в basename)?

+3

Вы бесплатно DIRC и BASEC (согласно strdup) и вы не освобождаете dname и bname (в соответствии с basename/dirname). Но вы не можете освободить dirc, пока вам больше не понадобится dname. – rici

ответ

3

dname и bname мог использовать части dirc и basec соответственно, так что это не безопасно, чтобы освободить их.

Я сделал бы strdup результатов из dirname и basename звонков. Тогда можно бесплатно освободить dirc и basec, и вы ЗНАЕТЕ, что вам нужно освободить свои копии.

(да это грязно, но я думаю, что это чище, чем помнить, вы не можете бесплатно dirc еще потому, что dname может или не использовать его ...)

 Смежные вопросы

  • Нет связанных вопросов^_^