我理解的堆疊(stack)、動態記憶體分配與堆(heap)
看到第4章,首次接觸到堆(heap)這個概念,不好理解,所以用vs2010反彙編跟蹤下程式:
// use_new.cpp -- using the new operator #include <iostream> int main() { using namespace std; int nights = 65535; int * ni = &nights; int * pt = new int; // new運算子為程式動態分配記憶體(程式執行時進行的),類似於C語言中的malloc函式 *pt = 65535; cout << "int nights value = " << nights // 從堆疊(stack)中取得資料65535 << ": location = " << &nights << endl; cout << "int* ni value = " << *ni // 從堆疊(stack)中取得ni值(地址[ni]),依照此(地址)在堆疊(stack)從尋找*ni中的資料65535 << ": location = " << ni << endl; cout << "int* pt value = " << *pt // 從堆疊(stack)中取得pt值(地址[pt]),依照此(地址)在堆(heap)從尋找*pt中的資料65535 << ": location = " << pt << endl; double * pd = new double; *pd = 10000001.0; cout << "double* pd value = " << *pd << ": location = " << pd << endl; cout << "location of pointer pt: " << &pt << "; location of pointer pd: " << &pd << endl; cout << "size of pt = " << sizeof(pt) << "; size of *pt = " << sizeof(*pt) << endl; cout << "size of pd = " << sizeof(pd) << "; size of *pd = " << sizeof(*pd) << endl; delete pt; // 與new運算子成對出現,釋放new分配的記憶體空間。 delete pd; // 如果不用delete運算子,將發生記憶體洩露(被分配的記憶體再也無法使用了) return 0; }
1. 動態記憶體分配是指在程式執行時為程式中的變數分配記憶體空間,它完全由應用程式自己進行記憶體的分配和回收;
2. 變數nights、pt、pd的值都儲存在被稱為棧(stack)的記憶體區域中,這種儲存資料方式便是“自動儲存”;而new從被稱為堆(heap)或自由儲存區(free store)的記憶體池中分配記憶體,該記憶體池同靜態變數與自動變數的記憶體是分開的,這種儲存方式為“動態儲存”;3. Stack的記憶體管理是順序分配的,而且定長,不存在記憶體回收問題;而Heap 則是隨機分配記憶體,不定長度,存在記憶體分配和回收的問題;
跟蹤如下:
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------