2013-05-15 8 views
1

의 내부 기능 _S_oom_malloc의 디자인은 다음과 같습니다코드는 같다 SGI-STL 할당

template <int __inst> 
void* 
__malloc_alloc_template<__inst>::_S_oom_malloc(size_t __n) 
{ 
    void (* __my_malloc_handler)(); 
    void* __result; 

    for (;;) { 
     __my_malloc_handler = __malloc_alloc_oom_handler; 
     if (0 == __my_malloc_handler) { __THROW_BAD_ALLOC; } 
     (*__my_malloc_handler)(); 
     __result = malloc(__n); 
     if (__result) return(__result); 
    } 
} 

나는 두 가지 질문이 있습니다. 1. _S_oom_malloc이 무한 루프를 사용하는 이유는 무엇입니까? 2. 우리가 알다시피, _S_oom_malloc은 malloc이 __malloc_alloc_template :: allocate 함수에서 실패 할 때 호출됩니다. 왜 공간을 할당하기 위해 malloc을 사용합니까?

누구든지 나를 도와 줄 수 있습니까? 고마워.

답변

0

먼저 루프가 실제로 무한하지 않습니다. 두 가지 종료가 있습니다 : 요청 된 메모리 양을 할당하여 BAD_ALLOC 예외를 던집니다. 예외는, 현재의 new-handler가 null 포인터 인 경우에 Throw됩니다.

어떻게되는지 이해하려면 다음 페이지를 참조하십시오. 항목 49부터 Effective C++. 기본적으로 새로운 핸들러 중 하나

  • 는 예외를 던져 즉 set_new_handler
  • 에 널 포인터를 전달 (
  • 다른 새로운 핸들러
  • 설치 제거 새로운 핸들러를 설치 가능한 메모리를 확인 할 수
  • 또는 exit

둘째로, C 라이브러리 malloc은 공간을 할당하기 위해 대부분의 시스템에서 malloc은 잘 테스트되고 효율적으로 구현 된 기능입니다. 표준 라이브러리의 new 함수는 "간단하게"예외 안전하고 형식이 안전한 래퍼입니다 (사용자가 원하는대로 재정의 할 수도 있습니다).

+0

감사합니다. __my_malloc_handler의 기능은 무엇입니까? – lancerex

+0

그것은 현재 new-handler ('__malloc_alloc_oom_handler'에 의해 재설정 될 수있는)를 가리키는 로컬 함수 포인터 일뿐입니다. – TemplateRex

+0

알겠습니다. 대단히 감사합니다 !! – lancerex