2012-10-23 71 views
4

有什麼方法可以確定緩衝區是否由'malloc'分配?就像具有以下簽名的功能:識別分配給malloc的緩衝區()

bool is_malloced(void *buf); 

這樣的機制是否存在於posix中?

+0

'bool is_malloced(void * buf){free(buf);返回true; }';)說真的,我不知道這樣的事情。 –

+0

不,但你可以編寫自己的分配器來支持這個。但爲什麼你認爲你需要這樣一個功能? – TJD

+0

我其實不需要*這樣的功能,我只是好奇... –

回答

2

沒有。 C11和POSIX都不提供這樣的機制。如果

1

嗯,你是一個認真的人,你可以真正做到:

Hash *hsh; /* global hash already initialized. */ 
void *custom_malloc(size_t size) 
{ 
    void *ptr; 

    ptr = malloc(size); 

    hash_add(hsh, ptr); 
    return ptr; 
} 

/* tester */ 

_Bool malloced(void *ptr) 
{ 
     if(hash_retrieve(hsh, ptr)) 
      return TRUE; 
     return FALSE; 
} 

當然做這樣的事情簡直是瘋了,但實際上你可以。

+0

這是瘋了。這是一個思想實驗。它不會進入真正的代碼。 –

0

一種簡單的方法來模擬這樣的functinality將包裹在malloc()一個自定義功能,其中:

  • 分配一個緩衝器,其是例如在所分配的塊
  • 的開頭4個字節更大
  • 存儲一些幻數(32位)將其返回給調用者

給定一個指針可以檢查它是否之前遞增4個字節的指針是malloc'通過尋找神奇的編號。

當然,它並不完美:

  • 神奇的數字可以偶然在那裏。在包裝的free()呼叫中將它設置爲null可以提供幫助。用指針異或可以使它更可靠。不過,這是一種啓發式的方法。
  • 對於帶有內存保護的體系結構,當檢查指針是而不是 malloc'ed時,您可以觸發頁面錯誤。

所有的缺點,它仍然是一種有用的技術,我在調試嵌入式系統中的一些內存損壞時使用了它幾次。

如果我們打算用malloc()替換一些包裝,我們也可以建立一個分配塊的鏈表。更可靠,但也更復雜。