2014-01-07 62 views
-1

如何簡化使用宏這個C代碼釋放許多指針釋放許多指針:簡化使用宏

void main() { 
    char *a, *b, *c, *d, *e; 

    a = strdup ("test1"); 
    b = strdup ("test2"); 
    c = strdup ("test3"); 
    d = strdup ("test4"); 
    e = strdup ("test5"); 
    f = strdup ("test6"); 

    strcpy(a, ""); 
    strcpy(e, ""); 
    strcpy(f, ""); 


    if(!strcmp(a, "")) 
     free(a); 
    if!strcmp(b, "")) 
     free(b); 
    if(!strcmp(c, "")) 
     free(c); 
    if(!strcmp(d, "")) 
     free(d); 
    if(!strcmp(e, "")) 
     free(e); 
    if(!strcmp(f, "")) 
     free(f); 
} 
+0

這個編輯改變了很多東西。 –

+0

那麼,你想要釋放哪些?所有或哪些沒有「」值?或哪些有「」? –

+0

@Digital_Reality:其中有「」 –

回答

4

您的代碼被打破,對""的比較是沒有意義的。

你應該只是free()所有這些;如果任何分配失敗,指針將爲NULL,但通過NULLfree()是好的。沒有必要檢查應用程序級別。

我假定你的代碼是某種片段,旨在說明一個觀點,而不是實際的代碼。如果是這樣,那麼你當然應該刪除整個strdup()/free()舞蹈,只是使用常量字符串:

const char *a = "test1", *b = "test2" /* and so on */; 

UPDATE的問題已經被編輯之後,它使更少了意義。這是不是一個好主意,永遠strcpy()到由strdup()返回的字符串,因爲你不知道緩衝區的長度沒有辦法讓複製安全。另外,即使你用一個空字符串覆蓋了字符串,你仍然需要(當然)擁有內存,並且應該調用free()

這就是說,也許你正在尋找的東西是這樣的:

#define MAYBE_FREE(s) do { if(s != NULL && s[0] != '\0') free(s); } while(0) 

do/while循環的包裝,使宏觀表現爲一個語句,所以你可以這樣做:

MAYBE_FREE(a); 
if(something()) 
    MAYBE_FREE(b); 

等等。

+2

我會添加一個註釋,如果OP真的想將字符串與空字符串進行比較,他們應該使用'strcmp'來代替。 –

+1

這個問題的目標是簡化使用宏釋放許多指針 –