2014-09-30 115 views
3

我想使用POSIX的basename函數(而不是GNU的)。我應該在C中的basename/dirname之後釋放strdup指針嗎?

從手冊頁:

兩個目錄名稱()和基本名稱()可以修改路徑的內容,所以 可以期望調用這些功能之一時通過一個副本。

這些函數可能會返回指向靜態分配的內存的指針,這些指針可能會被隨後的調用覆蓋。 或者, 它們可能會返回一個指向路徑某些部分的指針,以便路徑引用的字符串不應該被修改或釋放,直到函數返回的 指針不再需要爲止。

它還說:

返回值
兩個目錄名()和基名()的返回指針null結尾的字符串。 (不通過這些指針來釋放(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); 

strdupstrndup )手冊頁說:

用malloc(3)獲得新字符串的內存,並且可以用free(3)釋放。

所以,問題是:我應該釋放DIRC和BASEC(按strdup),否(按basename)?

+3

您免費DIRC和BASEC(按的strdup)和你不會釋放dname和bname(根據basename/dirname)。但是你不能釋放dirc,直到你不再需要dname。 – rici 2014-09-30 01:00:42

回答

3

dnamebname可能分別使用dircbasec的部分,因此將它們釋放並不安全。

我想要dirnamebasename調用的結果strdup。那麼免費dircbasec是安全的,你知道你必須釋放你的副本。

(是的,它的混亂,但我認爲它比記住吸塵器,你不能自由dirc但因爲dname可能會或可能不會使用它...)