簡體   English   中英

為什么malloc()分配的內存比要求的多,並且如何在Mac OS X中禁用malloc?

[英]Why is malloc() allocating more memory than demanded and how can I disable malloc from doing this in Mac OS X?

我正在為一個機器人程序編寫一個程序,該程序將迷宮存儲為多維動態鄰接數組,並且由於將沿着迷宮遍歷發現節點,因此我嘗試為其分配初始內存,然后在重新分配新節點后重新分配內存被發現。 但是,我曾經意識到我存儲的數據要比使用malloc分配的數據多(我忘記使用realloc ),盡管它沒有給我帶來某種分段錯誤或其他錯誤。 所以我很想知道:

  1. 為什么malloc分配的內存超出了要求?
  2. 如何禁用此功能,以便可以正確調試程序? 我確定該機器人不會像我的16GB RAM MacBook那樣擁有堆內存,因此我想知道我的程序是否在程序中分配給它的內存中工作。

感謝您的答復!

與大多數人的想法不同,malloc不會直接從內核分配內存。 取而代之的是,它從內核獲取一塊內存,然后使用數據結構在用戶空間中管理該內存塊。 該數據結構曾經是一個堆,因此將其稱為“堆內存”。

上面的實際結果是,使用malloc分配的內存周圍沒有無效的內存。 實際上,將內存稍微增加一點不會導致程序崩潰。

除上述內容外,malloc本身不會以您希望的任何大小進行分配。 它通常以8、16或32字節的倍數分配塊,具體取決於用於管理堆的數據結構。 當您使用malloc分配1個字節時,實際上得到了大約15個字節,任何人都不會使用。 覆蓋這些字節不會引起任何明顯的不良影響。

如果要確保程序使用少量內存,rlimit / ulimit和co是您的朋友。 如果要確保不超出分配的緩沖區,我強烈建議使用地址清理器。 使用-fsanitize=address編譯(clang和gcc),一旦您超出緩沖區,程序將崩潰。 當然,這是以性能為代價的。

我還要補充說,僅在頁面邊界上才可以進行硬件訪問控制。 在Intel上,為4096字節。 即使對於從內核分配的內存,如果分配結束后的訪問未移出分配的頁面,它們也不會觸發分段錯誤。

  1. 不,您只是幸運。 您的程序調用了未定義的行為,因此任何事情都可能發生。

  2. 如果要在受限環境中運行程序,可以模擬目標計算機內存有限的事實。 在啟動程序之前,請在外殼程序中運行以下命令: ulimit -Sv 1000 它以千字節為單位,因此1000表示1兆字節。

有關ulimit的更多信息,請參見此處: http : //ss64.com/osx/ulimit.html-您也可以在Linux上使用它。

如果您不想每次都運行ulimit ,也可以使用C函數setrlimit()在程序中執行類似的操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM