2013-03-02 42 views
2

比方說,我想寫的malloc()在C99一個選中的版本 - 沒有什麼花哨,一個簡單的包裝,而如果malloc()回報NULL將打印錯誤消息stderr並退出。像記錄內存分配錯誤

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一起失敗。它只是要回過頭來,併發出write()調用stderr(2)的文件描述符。它沒有理由分配任何內存。

當然,你總是可以嘗試直接write()小號記錄,像這樣:

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

但同樣,這可能是矯枉過正。

此外,您不應該擔心每個庫調用的內存分配情況。使用選中的malloc()不能替代代碼中其他位置的良好錯誤檢查。