我有一段時間沒有編碼,所以請原諒。我有這個奇怪的問題。我一次嘗試malloc 8GB,我打算稍後管理與TLSF堆。也就是說,我想在整個應用程序中避免使用malloc,只需在開始時獲得一個大的glob並最終釋放它。儘管這是特點。在我的程序中,我一直在使用dlmalloc。鏈接它,一切都很順利。但是,現在當我一次嘗試malloc 8GB並鏈接到dlmalloc中使用它時,我在OSX上運行時遇到了段錯誤11,沒有使用dlmalloc,一切都很順利。如果我使用gcc或clang,無關緊要。系統雖然沒有8GB的RAM,但它有4GB。有趣的是,同樣的事情發生在Windows機器上,它具有32GB的RAM和Ubuntu的16GB的RAM。通過系統malloc它可以工作,分配通過,並且通過分配內存的簡單迭代按照預期在所有三個系統上工作。但是,當我在dlmalloc鏈接它失敗。試用了malloc和dlmalloc函數調用。系統malloc vs大malloc上的DLMalloc
分配本身是什麼了不起的事,普通的C99。
[...]
size_t bytes = 1024LL*1024LL*1024LL*8LL;
unsigned long *m = (unsigned long*)malloc(bytes);
[...]
我很困惑這裏的幾件事。即使沒有4GB或RAM的系統,系統malloc如何給我8GB malloc,這些虛擬頁面是什麼?爲什麼dlmalloc不這樣做?我知道可能沒有8GB RAM的連續塊分配,但爲什麼分段錯誤,爲什麼不是空ptr?
是否有可行穩健(希望與平臺無關的)解決方案獲得的RAM量一氣呵成通過malloc即使我不知道系統有那麼多內存?
編輯:程序是64位的是OS」這我跑的。
EDIT2: 所以我打了它更多一些。原來,如果我分解成1GB的塊,即8個獨立的malloc,然後它與dlmalloc一起工作。所以它似乎是一個連續範圍分配的問題,其中dlmalloc可能試圖僅在存在連續塊時分配。這使得我的問題更難以制定。是否有一種確定的方法可以在跨平臺的情況下獲得具有或不具有dlmalloc的內存塊的大小,並且如果沒有剩餘物理內存(可以在交換中,只要不失敗)就不會失敗。也可以通過跨平臺的方式來判斷malloc是否處於內存或交換狀態。
您正在使用的系統的交換分區有多大? – Jiminion
OSX上的100GB,600GB專用於其他兩個系統(Windows和其他Linux機器)的目的。 – Keyframe
不知道DLmalloc和malloc之間的區別,但是您能夠使用malloc 8 GB的原因正是您所說的原因,它們是虛擬頁面。當一臺機器沒有足夠的物理RAM來支持所需的RAM時,它將使用硬盤空間。在功能上它有效,但讀取/寫入 – sedavidw