![](/img/trans.png)
[英]Why does malloc return NULL with plenty of memory and always at the same point?
[英]Where does malloc return memory?
我正在學習C語言中的malloc
函數。我知道如何使用
p = malloc(number_of_bytes);
並在以后不使用時將其釋放
free(p);
但是我想了解的理論要比這還多:我知道使用虛擬內存有三種可能性:
虛擬地址不能分配任何物理存儲(在頁面文件或物理內存中)
虛擬地址可以在頁面文件上具有物理存儲
虛擬地址可以在物理內存上具有物理存儲
所以,我的問題是:
malloc
返回的內存在哪里(我的意思是,它在頁面文件上還是在物理內存上(可能是堆?))?
是在頁面文件上還是在物理內存上?
在具有虛擬內存管理功能的操作系統上, malloc
不知道其分配的虛擬內存如何映射到物理內存,而這完全是設計使然。 malloc
在比虛擬內存管理器更高的級別上運行。 在操作系統提供的地址空間中malloc
所有內存是相同的。
某些頁面可能以物理映射開始,然后稍后才換成文件,然后根據需要重新換回內存。 但是,操作系統對您的程序透明地完成所有這些操作,因此malloc
不知道物理內存。
它是特定於實現的。 在具有GNU libc或musl-libc的 Linux上, malloc
通常調用mmap(2) 系統調用以從內核獲取更多虛擬內存。 free
通常將內存區域標記為可被將來對malloc
調用重用,但偶爾(對於大內存區域)使用munmap
釋放內存
使用strace
並研究相關的源代碼...(通常, malloc
是在Linux上的一些免費軟件標准C庫中實現的)。 我相信musl-libc具有malloc
可讀性很好的實現
閱讀有關進程 , 虛擬地址空間 , 虛擬內存和高級Linux編程的更多信息 。
另請參見proc(5)並考慮cat /proc/$$/maps
和cat /proc/self/maps
專門在Linux上,也請閱讀有關Linux內存過量使用的信息 。 這是我不喜歡且正在禁用的功能...
注意ASLR 。 您可以禁用它(例如,在GDB下具有可重現的觀察點)。
要調試與malloc
相關的問題(尤其是內存泄漏 ),請使用valgrind (以及最近的GCC編譯器的-fsanitize=
debugging選項 )。
通常,如果有,它將分配在虛擬內存中。 因此,我們假設它有一個,並且存儲硬件由硬盤和RAM組成。 如果物理內存(RAM)中沒有可用空間,它將在硬盤內的頁面文件中分配。
堆是對象的內存,並且分配相同。 只是為了澄清有關堆的概念,想象一個沒有操作系統,沒有虛擬內存的嵌入式應用程序,如果它是一個對象,它將分配在物理內存(RAM)的堆區域中,如果不是,它將分配在堆區域之外,但仍在物理內存(RAM)中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.