内存不足的故障处理方法

时间:2012-12-08 17:35:13

标签: c memory memory-management out-of-memory

我正在实现一个功能,我希望它是一个“库质量”功能:

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 个答案:

答案 0 :(得分:1)

我建议使用malloc的包装器,假设xmalloc(或calloc的某个等价物),返回NULL,导致内存不足的情况应用程序的责任 - 或终止申请。前者是强大的便携式库的理想选择。然而,在现代操作系统的背景下,后者是相当合理的;当发生OOM错误时,应用程序会遇到严重问题,无论如何都可能无法恢复。 xmalloc可以尝试执行一些清理,保存关键数据等。

答案 1 :(得分: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添加到参数中以获得额外的乐趣)