2013-03-02 5 views
2

의 내가 C99에서 malloc()의 체크 버전을 쓰기 위해 노력하고있어 가정 해 봅시다 - 공상 아무것도, malloc() 반환하는 경우 NULLstderr에 에러 메시지를 출력하고 종료하는 간단한 래퍼. 이와 함께 문제의로깅 메모리 할당 오류

void* checked_malloc(size_t size) { 
     void* ptr = malloc(size); 
     if (ptr == NULL) { 
      fprintf(stderr, "Failed to allocate %zd bytes\n", size); 
      exit(1); 
     } 
     return ptr; 
    } 

같은 뭔가 fprintf와 - 그것은 자신에 메모리를 할당을 시도 할 수 있습니다 우리는 메모리가 부족하기 때문에 이미 비정상적으로 실패 할 것이다.

메모리 할당 실패 후 오류 메시지를 확실하게 기록하는 방법이 있습니까? 또는 더 나은 접근 방법이 있습니까? malloc()을 작성 했습니까? 컴파일러에 의존하지 않는 솔루션이 대단히 좋습니다.

답변

1

솔직히 말해서 나는 너무 편집증 적이라고 생각합니다. 현재의 솔루션은 괜찮아 보입니다. fprintf()ENOMEM으로 실패 할 이유가 없습니다. 그냥 뒤돌아 을 호출하여 stderr (2)의 파일 설명자를 호출합니다. 메모리를 할당 할 이유가 없습니다.

static const char oom[] = "Out of memory!\n"; 
write(2, oom, sizeof(oom)); 

을 그러나 다시, 그것은 아마 잔인한 :

물론, 당신은 항상 다음과 같이 직접 write()의로 로그인을 시도 할 수 있습니다.

또한 모든 라이브러리 호출이 메모리 할당과 관련하여 무엇을하는지 걱정하지 않아도됩니다. 확인 된 malloc()을 사용하면 코드의 다른 곳에서 좋은 오류를 검사 할 수 있습니다.