2009-09-15 45 views
2

我意識到任何這樣的功能都可能是非標準的,但對我的用例來說沒關係。基本上,我需要一個方法(即使它只通過glibc的syscall()接口公開),我可以將指針傳遞給(通過前一次調用malloc()返回的指針),該指針返回塊的大小指針指向。這樣的事情存在嗎?任何函數來查詢分配塊的大小?

+0

我們以前做過這個。兩次我想。鏈接來... – dmckee 2009-09-15 17:53:53

+1

http://stackoverflow.com/questions/232691/how-can-i-get-the-size-of-an-array-from-a-pointer-in-c和http:// stackoverflow.com/questions/1208644/how-can-i-get-the-size-of-a-memory-block-allocated-using-malloc-closed – dmckee 2009-09-15 17:56:35

+0

BTW:我發現我的那些搜索「[的malloc]發現大小的塊」。 – dmckee 2009-09-15 17:57:41

回答

2

所以,據我所知,至少有在C90/C99無此功能。一些系統,主要是libc,提供了獲取分配大小的函數(例如Mac OS X中的malloc_size()),但這不是可移植的,可能你應該避免使用它。

1

沒有必要使用非標準的功能,它不是很難與必要的功能寫你自己的分配器。

你必須知道的大小,當你分配塊,所以乾脆保留該信息。國際海事組織在很少情況下不會知道這些信息,因爲根據定義,您在分配時就知道它。然而,如果你需要這樣的功能,你可以簡單地通過包裝malloc()來完成,並且將大小預先等待到塊。

void* smalloc(size_t size) 
{ 
    // allocate block with additional space for size 
    void* blk = malloc(size + sizeof(size_t)) ; 

    // set the size 
    *((size_t*)blk) = size ; 

    // return pointer to block after size field (user block) 
    return ((size_t*)blk) + 1 ; 
} 

void sfree(const void* blk) 
{ 
    // Free from the size field address, not the user block 
    free(((const size_t*)blk) - 1) ; 
} 

size_t ssize(const void* blk) 
{ 
    // Size is immediately before user block 
    return *(((size_t*)blk) - 1) ; 
} 

在吉姆·巴克的觀點;在某些目標上,可能需要一些跳動來保持必要的對齊。如果對齊不是最優的,某些目標將生成效率較低的代碼,而其他目標則會導致中止。所以要小心這個解決方案。我個人對這種解決方案的需求很謹慎!

一個解決方案可能是使用一個數據結構,如以malloc地址爲關鍵字的哈希表,並將大小作爲內容,並使用相同的包裝技術將大小與塊分開存儲 - 在費用或性能,額外的存儲空間,以及可管理的區塊數量方面可能有限的容量限制。

但是你這樣做,根本點依然有效 - 包裝的基本服務提供你所需要的。

+0

我注意到,這與Emil H的解決方案在dmckee對原始問題的評論中的第二個鏈接中給出的或多或少相同。然而,作爲評論的代碼或許它仍然有優點,所以我讓它站起來。 – Clifford 2009-09-15 18:29:25

+1

這打破了任何對齊保證,malloc可能會在特定的平臺上給你。例如,如果你在一個保證8字節對齊的平臺上,現在這個代碼示例將它變成4字節對齊。 – 2009-09-15 18:42:44

+0

(上面假設當然是一個4字節的sizeof(size_t)。) – 2009-09-15 18:44:04

0

_msize在Windows平臺上。