動態開闢記憶體總結

2021-07-22 07:13:16 字數 2021 閱讀 2711

動態開闢記憶體是在程式執行過程中進行開闢空間的,主要在堆,棧中開闢 

有關堆中動態開闢記憶體空間的函式有malloc,calloc,realloc,free。棧中開闢空間的有alloca。

void *malloc( size_t size);

void *calloc( size_tnum, size_tsize);

void *realloc( void *memblock, size_tsize);

void free( void *memblock);

void *_alloca( size_tsize);

size_t為無符號整型,在進行申請時要注意其值的範圍,防止其整型溢位而帶來的誤差(例如申請乙個3,4gb的空間失敗,但是比這更大的空間或許能成功,主要在於整型溢位使其值變小)。

malloc函式申請的size是以位元組為單位的,為了能夠提高可移植性,使用  sizeof(型別)*數目  來進行申請。如果申請成功則會返回乙個void *位址,若是失敗則會返回null,所以需要對該返回值進行判斷。要利用申請到的空間需通過返回的位址進行操作,將返回的位址進行強制轉化型別後才能開始使用。有關指標的操作,c對於其型別匹配十分的嚴格。開闢的空間是一段連續的記憶體空間,裡面的值都是隨機值。

在返回的位址前存在乙個關於該空間的結構體,記錄著該空間的申請資訊,當要釋放該空間時,以其返回的位址為基址,通過偏移一定長度的空間來找到該記憶體塊的狀態進行修改而釋放。不能對已經修改過的頭指標進行釋放,進行備份,釋放時使用原值,釋放完畢,將該指標賦值null。

realloc函式用於修改乙個原先已經分配的記憶體塊大小,可以對該空間進行擴大或者壓縮。特別注意在擴大記憶體時,定要接收其返回的位址,如果該記憶體塊不夠大時,作業系統會重新找到合適大小的記憶體塊並將原先的內容拷貝到該記憶體中並返回新記憶體位址,釋放原記憶體塊。如果記憶體塊足夠,則會將新加的記憶體塊新增到原先記憶體的後面,新記憶體未初始化時儲存的是隨機值,如果是縮小記憶體塊,則記憶體塊尾部的部分記憶體被系統**,剩餘部分記憶體的原先內容保留。

alloca函式是在棧中申請空間,申請之後的管理由系統操作,無需人工釋放,隨著函式的呼叫結束,它也自然消失,如同區域性變數的一樣。其彌補了c89版本前申請陣列時,中括號內不能出現表示式變數,只能是常數的缺憾。

申請失敗的原因有以下幾點:1.記憶體空間不夠。記憶體空間的大小由計算機的記憶體大小、其使用狀況和作業系統限制等因素限制。2.堆被鎖定,無法使用。3.作業系統不正常。

注意事項:1.不要訪問已經被free函式釋放了的記憶體(可以在釋放記憶體後,將此指標賦值為null)。

2.對null指標進行解引用操作,對分配的記憶體進行操作是越界,釋放並非動態開闢的記憶體,釋放一塊動態分配的記憶體的一部分(對返回指標操作時進行了賦值,使其位置偏移),對一塊動態記憶體釋放之後被繼續使用。

3.free的引數要麼是null,要麼是呼叫alloc返回的值,向free傳遞乙個null引數不起任何作用。

4.當動態開闢的記憶體使用完畢後,及時釋放,使其可以重新被分配使用。如果使用完畢不釋放會造成記憶體洩漏。

malloc的底層使用的brk和mmap系統呼叫,malloc是libc函式庫中的,其介於系統函式和庫函式之間,是嵌入在編譯器中的,linux下的編譯器g++,gcc使用的是ptmalloc。也存在tcmaloc,jemalloc等等記憶體管理庫。

new和malloc的區別:1>new是運算子可以過載,而malloc是庫函式,new的底層使用的malloc。2>new申請空間不需要確定大小,只需要傳入的是物件的數量,而malloc需要計算申請的記憶體大小。3>new 返回之後就是物件的型別,而malloc返回之後需要強制型別轉化為所需要的型別。4>new申請空間之後呼叫了建構函式進行初始化物件。5>new呼叫的delete釋放,而malloc呼叫free釋放。

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如全域性變數,static變數 2.從棧空間分配,函式呼叫完其被自動釋放 3.從堆空間分配,即動態記憶體開闢,比如 malloc,calloc,realloc,何時申請何時釋放 malloc 函式原型void malloc s...

動態記憶體開闢

記憶體分配有三種方式 1.從靜態儲存區分配,生命週期隨程式的結束而結束,比如說全域性變數,static變數 2.從棧空間分配,函式呼叫完成後被自動釋放 3.從對空間分配,即動態記憶體開闢,比如malloc,calloc,realloc malloc calloc realloc和free mallo...

動態記憶體開闢

1.記憶體分配方式 三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的...