2013-05-15 35 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.如我們所知,當malloc在__malloc_alloc_template :: allocate函數中失敗時,_S_oom_malloc將被調用。爲什麼它使用malloc分配空間?

任何人都可以幫到我嗎?非常感謝。

回答

0

首先,循環並非真正無限。有兩個退出:通過分配請求的內存量拋出BAD_ALLOC異常。當前的新處理程序是空指針時將拋出異常。

要了解如何發生,請參閱第49項從Effective C++。基本上任何新的處理程序可以

  • 使更多的內存可用
  • 安裝一個不同的新的處理程序
  • 卸裝新的處理程序(即傳遞一個空指針set_new_handler
  • 拋出一個異常
  • abortexit

其次,它使用C庫的原因malloc來分配空間是大多數系統上的malloc是一個經過良好測試和高效實現的功能。標準庫的new函數是「簡單」異常安全的和類型安全的包裝器(如果你需要的話,你作爲用戶也可以覆蓋)。

+0

非常感謝,__my_malloc_handler的功能是什麼? – lancerex

+0

它只是一個指向當前新處理程序(可以通過__malloc_alloc_oom_handler重置)的本地函數指針。 – TemplateRex

+0

我明白了。非常感謝你!! – lancerex

相關問題