記憶體分配(持續更新)

2021-08-22 19:20:30 字數 2880 閱讀 7970

#include

int brk(void *end_data_segment);

成功返回0,否則為-1

將記憶體邊界設定為引數所指定位置

void *sbrk(intptr_t increment);

成功返回之前的記憶體邊界,失敗返回(void*)-1

增加記憶體邊界,返回為新分配記憶體的起始位置(sbrk(0)就是獲得堆位置)

使用的例子

#include 

#include

using

namespace

std;

int main()

}pnow = phead; // 從頭列印

while(pnow!=sbrk(0))

#include

void *malloc(size_t size);

成功返回分配的首位址,失敗返回null

void

free(void *ptr);

若無法分配記憶體,或者因為已經抵達記憶體邊界所能達到的位址上限,則malloc返回null,所以一定要進行malloc返回值的錯誤檢查。

free函式並不降低記憶體邊界的位置,而是將這塊記憶體新增到空閒的記憶體列表中,供後續的malloc迴圈使用。

說清楚點就是free並不是把棧的位址的內容給清零,而是告訴系統棧的某塊內容可以被使用而已。如果夠不告訴系統,則表明該區域一直在使用(實際上已經不使用了)。那麼系統在做下一次new或者malloc的操作的時候就會開闢另乙個空間。但是棧空間是有限的,如果一直沒有free那麼這個棧就會溢位。

注意:

如char pt=(char )malloc(10*sizeof(char));

需要free(p)才會釋放空間。

如果free的引數不是當時malloc返回的位址,就會出現如圖的錯誤(改了很久的bug 2333)

出現上圖改了很久之後,我就在想,為什麼一定要free引數是malloc的返回值,查了系統程式設計之後看到一張圖就明白很多了。

當malloc分配記憶體塊的時候,會額外分配幾個位元組來存放記錄這塊記憶體大小的整數值。該整數字於記憶體塊的起始處,而malloc返回的是記憶體塊之後的位置(箭頭的位置)。free就去查詢這個記憶體頭的具體資訊,來進行對malloc資料的釋放,所以free的引數一定要傳對,不然free就會出現嚴重的錯誤!!!

#include

void *calloc(size_t numitems,size_t size);

成功返回建立的初始位址,並且初始化記憶體為0,失敗返回null

char pt==(char )calloc(100, sizeof(char));

然後用calloc開闢的空間其內容會自動初始化為空,等於把該棧中使用的空間清零。也就是賦值』\0』。(因為是char,所以是\0)。也需要用free來對該空間進行釋放

#include

void *realloc(void *ptr,size_t size);

成功返回指向大小調整後記憶體塊的指標,失敗返回null

注意:①呼叫relloc(ptr,0)等效於在free(ptr)之後呼叫malloc(0)

②若ptr為null,則realloc(null,size)相當於呼叫malloc(size)

③realloc增加了已分配的記憶體塊的大小,則不會對額外分配的位元組進行初始化。

④如果原來記憶體塊位於堆的頂部,那麼realloc將對堆空間進行拓展。如果記憶體塊位於堆的中部,且緊鄰其後的空閒記憶體空間大小不足,realloc會分配一塊新記憶體,將原來資料複製到新記憶體塊中,占用大量cpu時間,不推薦使用!

⑤擴充記憶體之後,原來指向記憶體的指標都用可能不能用,最好使用加偏移量的方式重新定位

char pt=(char )malloc(10*sizeof(char));

realloc(pt, 1000*sizeof(char));

#include

void *alloca(size_t size);

成功返回已經分配記憶體的指標

注意:①alloca相當於分配在棧上,到時候會自動銷毀,不能在定義的函式之外使用。②alloca是最特殊的開闢棧空間方法,優點是當離開呼叫這個函式的時候,棧所分配的空間會自動釋放(也就是free)。

③alloca不能在函式的引數中使用,因為函式引數位於棧幀固定位置。

//錯誤

func(x,alloca(size),x)

//正確

void funca(void)

//當funca返回的時候,y才銷毀

④因為編譯器會將alloca作為內聯**處理,並通過直接調整堆疊指標來實現。

做malloc類似的開闢空間的操作之後,當不使用的時候不做釋放結果導致一直佔據該記憶體單。(用動態儲存分配函式動態開闢的空間,在使用完畢後未釋放,結果導致一直佔據該記憶體單元。直到程式結束。)棧將穩步增長,直至抵達可用虛擬記憶體的上限,在之後分配記憶體的任何嘗試都將以失敗告終。

opencv裡的記憶體洩漏(持續更新)

1.在使用clone之前沒有對目標矩陣釋放。比如 cvmat a cvcreatemat 5,5,cv 32f cvmat b cvcreatemat 5,5,cv 32f a cvclonemat b 這樣a所指向的那個mat就會洩漏出去了。正確的做法是在clone之前release掉原來的那個矩...

記憶體分配 Go記憶體管理 記憶體分配一

go作為乙個比較新晚 新 的語言,自然借鑑前輩們的優點,比如說語言本身負責記憶體管理 對協程和高併發的高優支援 簡單高效的語法等。本篇及後續的幾篇要講的就是還沒提到的比較複雜的記憶體管理。學習記憶體管理 分配 前,如果有jvm的記憶體管理的基礎,會變得非常簡單,如果是第一次接觸記憶體管理,在看完go...

gpu 持續更新

1.從記憶體向視訊記憶體傳輸資料 a.pci peripheral component interconnect外部裝置互聯 匯流排,pci的傳輸速率為100mb s b.agp accelerated graphic port高速圖形埠 匯流排,此匯流排為專用的高速匯流排,可以快速的儲存在系統快取...