2012-12-08 2 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

나는 이제 xmalloc (또는 calloc 일부 동급) 메모리 부족 조건을 응용 프로그램의 책임을, NULL를 반환한다고 가정 해 봅시다 malloc에 대한 래퍼를 건의 할 것입니다. 전자는 강력하고 이식 가능한 라이브러리를위한 좋은 선택입니다. 그러나 현대 운영 체제의 맥락에서 후자는 상당히 합리적입니다. OOM 오류가 발생하면 응용 프로그램이 심각한 문제가 발생하며 어쨌든 복구 할 수 없습니다. xmalloc 등, 중요한 데이터를 저장, 몇 가지 정리를 수행하려고 시도 더 나은

1

인수를 변경하거나 무료하지 않고 대신 새로 할당 된 문자열을 반환 할 수 : BTW

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"); 

해야합니다. (여분의 재미를 위해 인수에 const를 추가하십시오)

+0

멋지고 우아합니다. 그러나 : 인수 중 하나만 NULL 인 경우 다른 (NULL이 아닌) 문자열을 새 할당 문자열로 반환합니다. 둘째로, 가장 중요한 메모리 부족 오류 처리는 내 것과 동일하며 몇 가지 대안을 찾고 있습니다. – Sanich

+0

이 함수를 둘러싼 래퍼로 함수를 쉽게 재정의 할 수 있습니다. 누출을 유지할 수도 있습니다. – wildplasser

+0

BTW :주의 깊게 보면, 인수 중 하나가 NULL이면 위의 코드가 "other"문자열의 복사본을 반환한다는 것을 알 수 있습니다.(둘 다 NULL이면 NULL) – wildplasser