之所以想談談這個是因為,最近在上網搜尋的時候無意間發現,有人誤將資料結構中的堆(就是那個「大頂堆」「小頂堆」的堆)和記憶體結構中的「堆」弄混了。
記憶體型別中的堆其實其實用來指一塊能夠自由申請釋放的記憶體區域,其實是和資料結構中的堆是沒有關係的。記憶體中的堆就是一「堆」東西的「堆」的意思。我猜測會有人弄混這兩者的關係的原因是,堆經常和棧放在一起提起,而棧又恰好是一種資料結構。所以經常會有人搞混記憶體型別中的堆和資料結構中的堆。
不管怎麼樣,我們直接開始吧。記憶體中的堆是作業系統提供的一塊記憶體空間,程式可以隨時動態分配這部分空間,並獲得若干區塊(blocks)。c語言中經常使用的malloc
和free
就是用來從堆中獲取劃分好的記憶體的,例如:
// dynamically allocate 10 bytes
char *buffer = (char *)malloc(10);
strcpy(buffer, "hello");
printf("%s\n", buffer); // prints "hello"
// frees/unallocates the dynamic memory allocated earlier
free(buffer);
上面這部分**就是用malloc
從堆中劃分了10位元組的空間,並往這個空間填入了hello
字元(順帶一提,如果不是填入字元二十別的內容的話可以用memcpy
)。在輸出了內容之後使用free
釋放掉了請求的記憶體空間。
除了malloc
和free
之外,new
和delete
請求/釋放空間的操作都是在堆中進行的。
另外,如果申請了記憶體空間之後,而這個記憶體空間沒有任何指標指向它,那麼就是發生了記憶體洩露。此時這個空間沒辦法被辦法被直接訪問,也沒辦法釋放,除非整個程式結束,作業系統就會把記憶體**回去。
堆裡面的內容總是可以訪問的,直到程式釋放掉堆裡面的內容。與此相對的是棧,區域性變數是儲存在棧裡面的,所以作用域要小很多(當然也有例外,如靜態的區域性變數,這個是和全域性變數存在一起的)。
此外,堆和棧的生長方向不同,堆向下生長,棧向上生長。
c++——堆、棧與記憶體管理
heap memory
what is a memory heap?
c/c++程式記憶體的分配:似乎是個大佬
關於記憶體中棧和堆的區別
1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...
關於記憶體中棧和堆的區別
原文 http blog.csdn.net nileel archive 2009 06 29 4307284.aspx 1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new m...
關於記憶體中棧和堆的區別
1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分配釋放,存放函式的引數值,區域性變數的值等。...