C 中的記憶體區域

2021-06-28 12:53:26 字數 1139 閱讀 1089

常量資料:常量資料區域主要用於儲存字串以及其他在編譯期就已經知道值得資料。例項化的物件不能儲存在這個區域。

在程式的整個生存期內,這個區域中的所有資料都有效,而且都是唯讀的,對這些資料進行修改的結果在c++中是沒有定義的。一部分原因是編譯器可能會對常量資料的基本儲存格式進行任意的優化。例如,在某個特定的編譯器中,可能會將字串常量儲存在重疊物件中以進行優化。

棧:在棧中儲存的是自動變數。自動變數在定義時將被立即構造,並且在其作用域結束時被立即銷毀,因此程式設計師無法對已經分配但尚未初始化的棧空間直接操作(除非你有意的使用顯式析構函式和placement new的語法)。

棧記憶體的分配通常要比動態記憶體的分配(堆和自由區)快很多,因為每次棧記憶體的分配只涉及棧指標的自增操作,而無需複雜的記憶體管理。

自由儲存:自由儲存是兩種動態記憶體區域之一,是通過new/delete來分配/釋放的。

物件的生存期可能會小於所分配的儲存空間的生存期。也就是說,自由儲存區域中的物件在分配記憶體時,並不要求立即被初始化,而且在銷毀物件時,也不要求被立即釋放記憶體空間。在儲存空間已經被分配但還沒有進入物件生存期的這段時間內,雖然可以通過乙個void*型別的指標來訪問和操作這塊儲存空間,但卻不能訪問物件中任何乙個非靜態的成員變數和非靜態的成員函式,不能獲得它們的位址,或者進行其它的操作。

堆:堆是另一種動態記憶體區域,是通過malloc()/free()函式以及這些函式的其它形式來分配/釋放的。

需要注意的是,儘管在某個特定編譯器中,預設的全域性運算子new和delete可能會用函式malloc()和free()來實現,但堆還是不同於自由儲存,但堆中分配的記憶體不能在自由儲存區中安全的釋放,反之亦然。

在堆中分配的記憶體,可以在物件的placement new構造過程和顯示的析構過程中使用。如果要這樣使用,那麼自由儲存區域中關於物件生存期的注意事項在堆中也同樣適用。

全域性/靜態:在程式啟動時,全域性變數/物件或靜態變數/物件就已經分配了儲存空間,但只有等到程式執行時,這些變數/物件才會進行初始化。例如,只有當程式第一次執行到變數的定義語句,函式中的靜態變數才能被初始化。

對於跨越多個編譯單元的全域性變數,它們的初始化順序是未定義的,因此,在管理全域性物件(包括類的靜態成員)之間的依賴性時要特別小心。通常來說,可以通過乙個void*指標來對未初始化的物件儲存空間進行訪問和操作,但不能在物件的生存期之外來使用或者引用非靜態的成員變數和成員函式。

C 中記憶體區域的劃分

那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。那些由new或者malloc分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個new就要對應乙個delete。如果程式設計師沒有釋放掉,那麼在程式結束後,作業系統會自動 ...

C 程式的記憶體區域

在c 中程式的記憶體區域,可以分為四大部分吧 區 全域性資料區 堆區 棧區。區 顧名思義它就是存放我們所打的 的放置區啦。全域性資料區 存放程式的全域性資料和靜態資料全域性資料 它有個關鍵字extern就是宣告全域性量的 include using namespace std extern int ...

c 記憶體區域劃分

c 中,記憶體分為5個區域 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。其中 棧 就是那些編譯器在需要的時候分配,不需要的時候清理的變數的儲存區域,比如區域性變數和函式引數。在記憶體中連續儲存的區域,位址從低到高。堆 就是new分配的記憶體塊,需要delete。如果沒有delete,在程式退...