C语言 内存不足故障处理方法



我正在实现一个函数,我希望它是一个"库质量"函数:

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 库的大型应用程序来说并不好。

问:有更好的解决方案吗?

我会建议malloc包装器,假设xmalloc(或calloc的等价物),它返回NULL,使内存不足条件成为应用程序的责任 - 或终止应用程序。前者是强大的便携式图书馆的不错选择。然而,在现代操作系统的背景下,后者是相当合理的;发生 OOM 错误时,该应用程序遇到严重问题,并且可能无法恢复。 xmalloc可以尝试执行一些清理,保存关键数据等。

最好不要更改或释放参数,而是返回一个新分配的字符串:

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;
}

顺便说一句:如果字符串一或二不是由 malloc() 获得的,这个函数也应该工作;因此不应该被释放。这样

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

应该工作。(在参数中添加常量以获得额外的乐趣)

最新更新