堆是乙個大容器,它的容量要遠遠大於棧,這可以解決由於棧造成的記憶體溢位的困難(由於棧一般都是以k為單位,如果程式中直接將較大的陣列儲存在函式內的棧變數中,很可能會記憶體溢位)。一般比較複雜的資料型別都是放在堆中。但是在c語言中,堆記憶體空間的申請和釋放需要手動通過**來完成.
在這個檔案中:
#include "stdlib.h"
有這兩個函式:
void *malloc(size_t __size) __result_use_check __alloc_size(1);
void free(void *);
如果malloc分配成功:則返回指向被分配記憶體空間的指標
不然,返回空指標null。
同時,當記憶體不再使用的時候,應使用free()將記憶體塊釋放掉。
關於:void *,表示未確定型別的指標。c,c++規定,void *型別可以強轉為任何其他型別的的指標。
用來在堆中申請記憶體空間的函式還有calloc和realloc,用法與malloc類似。
學習記憶體管理就是為了知道日後怎麼樣在合適的時候管理我們的記憶體。那麼問題來了?什麼時候用堆什麼時候用棧呢?一般遵循以下三個原則:
1.如果明確知道資料占用多少記憶體,那麼資料量較小時用棧,較大時用堆;
2.如果不知道資料量大小(可能需要占用較大記憶體),最好用堆(因為這樣保險些);
3.如果需要動態建立陣列,則用堆。
int main()
c語言 動態記憶體管理(總結)
為什麼存在動態記憶體分配?開闢空間的方式有兩個特點 空間開闢大小是固定的。陣列在申明的時候,必須指定陣列的長度,它所需要的內存在編譯時分配。因此在這種情況下,要達到有效的資源利用,必須在執行時動態地分配所需記憶體,並在使用完畢後盡早釋放不需要的記憶體,這就是動態記憶體管理原理。記憶體分配的方式 ma...
C 記憶體管理2
我們都知道c 中有三種建立物件的方法,如下 include using namespace std class a a int main 第一種和第二種沒什麼區別,乙個隱式呼叫,乙個顯式呼叫,兩者都是在程序虛擬位址空間中的棧中分配記憶體,而第三種使用了new,在堆中分配了記憶體,而棧中記憶體的分配和...
總結 OC記憶體管理 2
上篇文章對記憶體管理進行了概括性描述,本篇文章將對retain方法和release方法的具體使用場景做出描述 被遺忘一次,計數器 1 release方法 被遺忘分為兩種 主動遺忘和被動遺忘 方式一 呼叫者有了新物件,故意遺忘掉老物件 示例 乙個person有了新wife void setwife g...