進程的虛擬內存缺頁中斷(可能段違規(guī))
、
判斷該引用是否有效是看該頁面是不是通過正常手段聲明要使用的,例如malloc申請,就會發(fā)生正常的缺頁中斷。而隨意在malloc后面的內存空間進行訪問,可能就會發(fā)生段違規(guī)(因為mallo的內存是一塊一塊的分配的,也許后面挨著的地址那塊已經分配給進程了)。
數(shù)據(jù)段和堆(heap)
原來堆是屬于數(shù)據(jù)段的,位于數(shù)據(jù)段的頂部,而且堆是可以動態(tài)變化大小的。
內存泄漏
程序結束的時候,其內存就會被釋放的,所以一些不會長時間駐留的程序不用考慮那內存回收等問題。然而一些
生存世家較長的程序,如日歷管理器,郵件工具等程序,需要我們詳細斟酌動態(tài)內存的分配和回收。因為C語言沒有java那樣的垃圾收集器(自動確認并回收不再使用的內存塊)。這些程序,在使用malloc和free的時候需要非常謹慎。堆經常會出現(xiàn)兩種類型的問題。
釋放或改寫仍在使用的內存(稱為“內存損壞”)
未釋放不再使用的內存(稱為“內存泄漏”)
如何檢測內存泄漏
總線錯誤,段違規(guī)
另外總線錯誤和段錯誤的準確原因在不同的操作系統(tǒng)版本上各不相同,歸根結底這兩種錯誤都是硬件告訴操作系統(tǒng)一個有問題的內存引用造成的。在缺省情況下,進程在收到“總線錯誤”或“段錯誤”信號后將進行信息轉儲并終止。所以一般會出現(xiàn)core dump的提示,之所以這里是core,是因為很久以前內存的材料是鐵氧化物圓環(huán)(core)。
總線錯誤
段錯誤