2012-12-08 61 views
0

我的功能實現,我想這是一個「庫質量」功能:外的內存故障處理方法

char** str_cat(char** const str, const char * const other){ 

    if(str==NULL) 
     return NULL; 
    if(other==NULL) 
     return str; 
    if(*str==NULL) 
     return str_cpy(str,other); 

    char* tmp=(char*)calloc(1,strlen(*str)+strlen(other)+1); 
    if(tmp==NULL) 
      return NULL; 
    strcat(strcpy(tmp,*str),other); 
    *str=tmp; 
    return str;  
} 

這是一個版本的strcat()函數(不同的簽名)並處理任何極端的用例。 但是,我的內存不足失敗處理方法對於大量使用豐富str_xxx()API庫的應用程序來說並不好。

問題:有沒有更好的解決方案?

+2

你是什麼意思「不好」?另外,我認爲你有一些內存泄漏? – Xymostech

+0

@Xymostech:內存泄漏 - 我想問題是我沒有釋放第一個參數並分配一個新塊。如果是這樣,因爲第一個參數是char **(指向字符串的指針),而且它可能是指向代碼段字符串的指針,我選擇不處理它。 – Sanich

+1

那麼,如果你擔心內存泄漏之前擔心內存不足的情況,那麼我認爲你的優先級混淆了。 – Xymostech

回答

1

我建議的包裝爲malloc,讓我們說xmalloc(或等值calloc),返回NULL,使得內存不足,條件下的應用程序的責任 - 或終止應用程序。前者是一個強大的便攜式圖書館的不錯選擇。然而,在現代操作系統的背景下,後者是相當合理的;當發生OOM錯誤時,該應用程序非常麻煩,並且可能無法恢復。 xmalloc可以嘗試進行一些清理,保存關鍵數據等

1

最好不要改變或免費的論點,但返回一個新分配的字符串,而不是:

char * mycatcat(char *one, char *two) 
{ 
size_t len1, len2; 
char *new; 

if (!one && !two) return NULL; 
len1 = (one) ? strlen (one) : 0; 
len2 = (two) ? strlen (two) : 0; 

new = malloc(1+ len1+ len2); 
if (!new) return NULL; 

if (len1) memcpy (new, one, len1); 
if (len2) memcpy (new+len1, two, len2); 
new[len1+len2] = 0; 

return new; 
} 

BTW:這個功能應該如果字符串也行一個或兩個是而不是 malloc();因此不應該被釋放。這樣的

char *onetwo; 
onetwo = my_catcat("eins", "zwo"); 

應該工作。 (將const添加到參數中以獲得更多樂趣)

+0

尼斯和優雅。但是:如果只有一個參數是NULL,我將返回另一個(不是NULL)字符串作爲新分配的字符串。其次,最重要的,內存不足的失敗處理與我的相同,我正在尋找一些替代品:) – Sanich

+0

您可以輕鬆地重新定義您的函數作爲此函數的包裝。你甚至可以維持泄漏。 – wildplasser

+0

順便說一句:如果你仔細看,你可以看到,如果其中一個參數是NULL,上面的代碼返回一個「其他」字符串的副本。(如果兩個都是NULL,則爲NULL) – wildplasser