【說明】
1. 棧又叫堆疊,非靜態區域性變數/函式引數/返回值等等,棧是向下增長的。
2. 記憶體對映段是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共享記憶體,做程序間通訊。
3. 堆用於程式執行時動態記憶體分配,堆是可以上增長的。
4. 資料段--儲存全域性資料和靜態資料。
5. **段--可執行的**/唯讀常量。
下面**講解了一些常用資料分別出現在哪些虛擬記憶體空間中
int var = 1;
static int staticvar = 1;
//var是全域性資料,staticvar是靜態資料都是在main函式之前初始化的,所以存在在資料段
void test()
;// 非靜態區域性變數 num1和testvar都在棧上
char char1 = "abcd";
// char1是乙個陣列,非靜態區域性變數在棧上
// *char1是指向數陣列頭乙個元素的指標,也是非靜態區域性變數同樣在棧上
char* pchar2 = "abcd";
// pchar2是乙個指向"abcd"常量的乙個指標,所以在棧上
// *pchar2就是對pchar的間引用,他就相當與常量"abcd",所以在**段上
int* ptr1 = (int*)malloc(sizeof (int)*4);
// ptr1是乙個指標,所以在棧上
// *ptr1相當於(int*)malloc(sizeof (int)*4) 而malloc是在堆上開闢空間的,所以*ptr1是在堆上
free (ptr1);
//使用malloc一定要使用對應的free否則會出現記憶體洩露
}
申請方式不同棧:由編譯器自動分配釋放,存放函式的引數,區域性變數等。結構是資料結構中的棧。是有上到下開闢空間。堆:由程式設計師分配釋放,如果不釋放的話,可能會造成記憶體洩漏問題。結構是鏈式。是想上開闢空間。
申請大小的限制不同
棧是從高位址到低位址擴充套件的,是一塊連續的記憶體區。棧的大小是固定的。如果申請的空間超過棧的剩餘空間,會提示overflow。
堆是從低地值到高位址的拓展,是不連續的記憶體區域,因為堆是用鍊錶來儲存導致的,堆的大小受限於計算機中有效的虛擬位址。
申請效率不同。
棧由系統自動分配,速度快。但是程式設計師無法控制。
堆由malloc分配,速度較慢,而且容易產生碎片,導致空間利用率低。
void* malloc (size_t size);
void free (void* ptr);
這個函式向記憶體申請一塊連續可用的空間,並返回指向這塊空間的指標。
如果開闢成功,則返回乙個指向開闢好空間的指標。
如果開闢失敗,則返回乙個null指標,因此malloc的返回值一定要做檢查。
返回值的型別是 void* ,所以malloc函式並不知道開闢空間的型別,具體在使用的時候使用者自己來決定。
如果引數 size 為0,malloc的行為是標準是未定義的,取決於編譯器。
free函式用來釋放動態開闢的記憶體。
如果引數 ptr 指向的空間不是動態開闢的,那free函式的行為是未定義的。
如果引數 ptr 是null指標,則函式什麼事都不做。
void test()
注意:申請和釋放單個元素的空間,使用new和delete操作符,申請和釋放連續的空間,使用new和delete
申請自定義空間:
void test2()
1. malloc和free是函式,new和delete是操作符
2. malloc申請的空間不會初始化,new可以初始化
3. malloc申請空間時,需要手動計算空間大小並傳遞,new只需在其後跟上空間的型別即可
4. malloc的返回值為void*, 在使用時必須強轉,new不需要,因為new後跟的是空間的型別
5. malloc申請空間失敗時,返回的是null,因此使用時必須判空,new不需要,但是new需要捕獲異常
6. 申請自定義型別物件時,malloc/free只會開闢空間,不會呼叫建構函式與析構函式,而new在申請空間
後會呼叫建構函式完成物件的初始化,delete在釋放空間前會呼叫析構函式完成空間中資源的清理
7. new/delete比malloc和free的效率稍微低點,因為new/delete的底層封裝了malloc/free
ios開發 記憶體管理 理解
retaincount是引用計數的意思。使用release使retaincount 1,使用retain使retaincount 1,當retaincount等於0的時候,該物件會被釋放掉。非arc記憶體管理 1 如果呼叫了alloc new copy產生了乙個新物件,最後肯定要呼叫一次releas...
Spring事物管理理解
資料庫事務 database transaction 是指作為單個邏輯工作單元執行的一系列操作,要麼完整地執行,要麼完全地不執行。事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為乙個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使 應...
c c 記憶體管理
我一直覺得記憶體是很複雜的東西.也許我把這篇文章完成的時候,我會了解一點c 的記憶體管理機制 從硬體開始 記憶體器位址空間 匯流排位址空間 cpu位址空間 虛擬記憶體位址空間 程式位址空間 邏輯位址空間 程式位址空間對c 程式設計師來說是可見的,其他位址空間我們並不關心 通過列印pointer的值 ...