根據用於分配內存的方法,C++中有3中管理數據內存的方式:自動存儲、靜態存儲和動態存儲(有時也叫做自由存儲空間或堆)。在存在是間的長短方面,以這三種方式分配的數據對象各不相同。下面簡要介紹這三種類型(注:C++11中新增了第四種類型——線程存儲)
1.自動存儲
在函數內部定義的常規變量使用自動存儲空間,被稱為自動變量(automatic variable),這意味着它們在所屬的函數被調用時自動產生,在該函數結束時消亡。例如,擋在一個自定義的函數getname()中定義了一個temp數組時,temp數組僅當getname()函數活動時存在。當成許控制權回到main()時,temp使用的內存將自動被釋放。如果getname()返回temp的地址,則main()中的name指針指向的內存將很快得到重新使用。這就是在getname()中使用new的原因之一。
實際上,自動變量是一個局部變量,其作用域為包含它的代碼塊。代碼塊是被包含在花括號中的一段代碼。
自動變量通常存儲在棧中。這意味着執行代碼塊時,其中的變量將依次加入到棧中,而在離開代碼塊時,將按相反的順序釋放着些變量,着被稱為后進先出(LIFO)。因此,在程序執行過程中,棧將不斷地增大和縮小。
2.靜態存儲
靜態存儲是整個程序執行期間都存在的存儲方式。是變量稱為靜態的方式有兩種:一種是在函數外面定義它;另一種是在聲明變量時使用關鍵字statis:
static double fee = 56.50;
3.動態存儲
new和delete運算符提供了一種比自動變量和靜態變量更靈活的方法。它們管理了一個內存池,這在C++中被稱為自由存儲空間(free store)或堆(heap)。該內存池同用於靜態變量和自動變量的內存是分開的。new和delete讓您能夠在一個函數中分配內存,而在另一個函數中釋放它。因此,數據的聲明周期不完全收程序或函數的生命時間控制。與使用常規變量相比,使用new和delete讓程序員對程序如何使用內存有更大的控制權。然而,內存管理也更復雜了。在棧中,自動添加和刪除機制使得占用的內存總是連續的,單new和delete的相互影響可能導致占用的自由存儲區不連續,這使得跟蹤新分配內存的位置更困難。
---------------------
作者:月光詩人
來源:CNBLOGS
原文:https://www.cnblogs.com/moonlightpoet/p/5647866.html
版權聲明:本文為作者原創文章,轉載請附上博文鏈接!