2013-07-31 205 views
5
void newHandler() { 
    cdebug << "memory allocation failure" << std::endl; 
    throw std::bad_alloc(); 
} 

int main() { 
    std::set_new_handler(newHandler); 
    // ... 
} 

一旦newHandler確立爲我們的錯誤處理程序捕獲的異常,當任何堆分配失敗,它會被稱爲 。有關錯誤 處理程序的一個有趣的事情是,它將被連續調用,直到內存分配成功,或者該函數拋出一個錯誤。內存分配

我對上述文本的問題是authore的意思是「直到內存分配成功,或者函數拋出一個錯誤」。在這種情況下,函數如何可以拋出錯誤?請求示例以瞭解。

感謝您的時間和幫助。

+0

的可能重複(http://stackoverflow.com/questions/7194127/how-應該我寫-ISO-C-standard-conformant-custom-new-and-delete-operators) –

+0

@Loki:這是一個比你發佈的可能重複更具體的問題。但我認爲標題應改爲:如何使用std :: set_new_handler – Phong

回答

7

基本上,你的處理器可能有3行爲

  • 它拋出一個bad_alloc的(或其衍生物類)。
  • 它調用exit或abord功能,停止程序的執行
  • 它返回,在這種情況下,一個新的分配嘗試將出現

裁判:http://www.cplusplus.com/reference/new/set_new_handler/

這是有益的,如果你不想處理每次新呼叫的分配錯誤。 根據您的系統(使用大量內存),您可以例如釋放一些分配的內存(緩存),以便下次嘗試內存分配可以成功。

void no_memory() 
{ 
    if(cached_data.exist()) 
    { 
    std::cout << "Free cache memory so the allocation can succeed!\n"; 
    cached_data.remove(); 
    } 
    else 
    { 
    std::cout << "Failed to allocate memory!\n"; 
    std::exit (1); // Or throw an expection... 
    } 
} 

std::set_new_handler(no_memory); 
+0

「發送預期」應該是「拋出異常」 –

+0

@Mike:謝謝,我會糾正它。 – Phong

0

意圖是處理程序可以釋放一些內存,返回,然後new()可以重試分配。只要分配保持失敗,new()就會調用處理程序。處理程序可以通過拋出bad_alloc()來中止這些嘗試,實質上是說'我不能釋放更多的內存,所以分配不能結束'。

更多細節在這裏:[?我應該怎麼寫ISO C++標準符合性定製new和delete操作符]

http://www.cplusplus.com/reference/new/set_new_handler/