天天看點

linux 動态記憶體配置設定,關于linux下動态配置設定記憶體的問題

關于linux下動态配置設定記憶體的問題

(2010-07-11 18:20:47)

标簽:

雜談

在古老的C中,一進中年人C++中,通常我們需要自己動态配置設定記憶體。記憶體的使用是最容易出問題的地方,一不小心就會出現越界通路等問題。

從作業系統的角度來看,系統是現在都是用保護模式來控制記憶體的通路。系統把記憶體映射到虛拟記憶體上,把原本零散的實體記憶體,映射到虛拟記憶體上來,是使用者請求系統配置設定的記憶體實際上系統的虛拟記憶體。

簡單回顧以下c以及c++中記憶體配置設定的函數

malloc(size_t size)//用于申請記憶體 new和他的功能一樣,但是new有預設的構造函數;

calloc (size_t nnumber,size_t size) //number

申請個數,size是申請類型的位元組數,功能與malloc相似,但是申請之後會清零;

realloc(void*ptr,size-t size);

//ptr,記憶體位址,,size,記憶體大小,此函數也可以釋放記憶體;

這是基本幾個記憶體的申請和配置設定方式,還有系統底層兩個函數;

brk( void*addr) and sbrk(void *addr)

mmap(void*addr,size_t long ,int proc, int flags,int fd,off_t

offset);

mmap函數比較負責,參數很多,前兩個就不詳細介紹,分别是指針的位址與記憶體的長度,proc是設定該記憶體是讀寫方式,PROC_READ|PROC_WRITE,主要是用到這兩個,flags是用來設定記憶體的共享方式,與檔案映射的關系:MAP_SHARED,設定記憶體為共享記憶體(這個在以後的程序間通信是很重要的選項)MAP_PRIVATE,MAP_ANOYNMOUS(MAP_ANON)括号内是簡寫,這個是設定是否映射記憶體與檔案相關

fd提取映射檔案的描述符,(fd=open(char*filename,int flags,int mode

))注意打開檔案的讀寫方式要與記憶體的方式一緻。如果不映射到檔案上,fd=0,最後一個參數必須是系統記憶體頁的整數倍,通常我們用0;

brk和sbrk比較有趣,很像遊标卡尺,通過brk來調整記憶體的大小。

值得注意的是用sbrk每次配置設定記憶體傳回的是記憶體的首位址,更進一步的說,其實malloc在做記憶體配置設定的時候,是一個很有趣的事情,比如申請一個4位元組的空間,其實他配置設定的是16個位元組的空氣。其實是系統在做這個配置設定的時候,做了一些手腳,因為每次配置設定的時候他其實是建立一個結構,結構體内有4哥成員變量,分别表示目前申請的空間,前一個空件的指針,下一個空閑空間的指針,目前空間的指針,此構成16個位元組的空間。

malloc,calloc,realloc的釋放記憶體函數是free,c++中是delete,功能相同,但是

delete會調用析構函數

brk和sbrk都可以釋放記憶體,但是要儲存記憶體配置設定的首位址進行釋放,eg。int

*p;int*p1=sbrk(4);如果直接操作p1,會使記憶體無法釋放,造成洩漏,是以要用p=p1,進行操作

分享:

linux 動态記憶體配置設定,關于linux下動态配置設定記憶體的問題

喜歡

linux 動态記憶體配置設定,關于linux下動态配置設定記憶體的問題

贈金筆

加載中,請稍候......

評論加載中,請稍候...

發評論

登入名: 密碼: 找回密碼 注冊記住登入狀态

昵   稱:

評論并轉載此博文

linux 動态記憶體配置設定,關于linux下動态配置設定記憶體的問題

發評論

以上網友發言隻代表其個人觀點,不代表新浪網的觀點或立場。