1. 程式人生 > >我理解的堆疊(stack)、動態記憶體分配與堆(heap)

我理解的堆疊(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 則是隨機分配記憶體,不定長度,存在記憶體分配和回收的問題;

跟蹤如下:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------