記憶體結構 堆結構及記憶體分配函式

2021-06-19 11:30:08 字數 1651 閱讀 4039

linux對記憶體結構的描述

1、在linux中,目錄/proc/$/下存放著相應程序執行時的所有訊號,其它maps中包含對該程序的記憶體分配信資訊,在命令列下執行maps即可檢視(必須是當前執行中的程序,程序結束時,對應目錄自動銷毀)補:ps aue 檢視有效程序 a所有使用者 u當前使用者 d當前程序

可以以如下程式做實驗:(32位ubuntu10.04)

編譯執行得到如下結果:

重開乙個命令列,使該程式保持執行狀態,進入到相應的目錄,可以看到當前執行程式的程序號,然後進入要對應目錄可以看到記憶體資訊。

一共有6列

第一列代表記憶體段的虛擬位址

第二列代表執行許可權,r,w,x不必說,p=私有 s=共享

不用說,heap和stack段不應該有x,否則就容易被xx,不過這個跟具體的版本有關

第三列代表在程序位址裡的偏移量

第四列對映檔案的主裝置號和次裝置號

第五列映像檔案的節點號,即inode

第六列是映像檔案的路徑

所有程式在記憶體中可分為四個基本部分:**區、全域性區、堆區、區域性棧。結合./test的執行結果與上圖對應,分析對應位址的範圍,linux中所有**首位址08048000,是固定的和windows類似,08048000-08049000顯然是**區,典型我自權根為x,所以常量a3在**區,man和add也在**區,a1,b2,a2在全域性區0804a000-0804b000,p1顯然是在09dc8000-09de9000之間,是堆區,b1和b3區域性變數在棧區bfbca000-bfbfd000。

下面用實驗編寫檢視堆和棧的區別:

程式如下:(執行環境同上)

執行結果為:

其按順序向下,依次是:在棧中的a1、a2、a3與在堆中的p1、p2、p3,顯然棧位址是按4位元組遞減(壓棧),而堆是16位元組遞增。查閱相關資料malloc使用乙個資料結構(鍊錶)維護分配空間,鍊錶的構成:分配的空間/上乙個空間資料/下乙個空間/空間大小等資訊(總共點十六個位元組),對malloc分配的空間不要越界訪問.因為容易破壞後台維護結構.導致malloc/free/calloc/realloc不正常工作。意思是,如果對malloc分配的空間p1,若*(p1+1)=2,會破壞堆結構鍊錶,導致堆空間錯誤。

c++的new與malloc的關係:

new的實現使用的是malloc來實現的.new使用malloc後,還要初始化空間.基本型別,直接初始化成預設值.自定義資料型別,呼叫指定的構造器,而delete呼叫free實現。delete負責呼叫析構器.然後在呼叫free。new只呼叫乙個構造器初始化,new迴圈對每個區域呼叫構造器。new()表示定位分配,意思是在已分配的空間中,再重新分配,自己管理空間。

堆的記憶體結構,物件記憶體如何分配,GC過程物件的轉移

堆的記憶體結構 第一次new出物件 這裡不討論分配在棧上的物件 普通物件放進eden區,物件很大就直接放進老年區 tenured 第一次gc,eden中沒有被 的物件 放進survivor 中 使用copying算發 第二次gc,將survivor 中存活的物件複製到survivor 中,這時候如果...

結構體內存分配及sizeof 用法

首先,看下題。include include include head.h pragma pack 8 using namespace std struct abcd struct cabd int main cout 結果 16 24 要能清除的分析上面的問題就要搞清楚結構體變數的成員在記憶體裡是...

關於堆及記憶體分配點滴

關於堆及記憶體分配點滴 1.無論是堆,還是棧都是對虛存的操作和管理。2.系統呼叫brk 和mmap 用來動態分配虛存空間,也就是表明這些虛存位址是合法的,訪問的時候,系統應為其分配物理記憶體,而不是報錯。3.堆的本質是動態申請的虛存空間。理論上可以用任何方式去管理這塊空間。但資料結構 堆 是最常用的...