C 堆 棧與記憶體管理

2021-10-07 16:55:09 字數 1407 閱讀 4791

一、所謂stack和heap

例子:

class

complex;.

...//作用域(scope)

stack:儲存區域性變數或臨時物件的一塊記憶體,函式呼叫結束會消失

heap:存放全域性物件或變數的記憶體空間,函式呼叫結束如果不通過delete 釋放將直到程式執行結束之前一直存在。

二、static local objects

為了讓將函式中的區域性變數或臨時物件一直存在直到程式結束為止,那麼既可以用靜態宣告來實現。

三、global objects

宣告在整個程式結束之後才結束。

四、heap objects生命期

complex * p = new complex(3);

。。。delete p;//p所指的便是heap object,其生命在他被deleted之際結束。

當不用delete時,會出現記憶體洩露,因為指標指向的記憶體空間任然存在。

補充:new:先分配memory,再呼叫actor(分配記憶體用過malloc()實現,釋放用free())

五、記憶體管理(動態分配所得到的的array)

//動態分配乙個複數

complex* pc =

newcomplex(1

,2);

//new乙個複數

會獲得的大小為8byte(複數,兩個double(每個double 4bytes)),但是在除錯模式下不止8byte。

動態分配所得的記憶體塊(memory block),in vc

8+(32+4)+(4*2) = 52//52不能整除16,所以分配64bytes記憶體

也就是在new分配記憶體時,會多分配多得多的記憶體,這是必要的,因為在**的時候能用到。

分配的空間中,頭位址會表示記憶體,是16的倍數,最後乙個byte1表示使用者收回,0表示使用者給出。例如:00000041表述64bbytes空間加上1表示使用者收回,一共65bytes.

q:如果分配的是陣列呢?

a:complex* p = new complex[3];

三個複數:83 = 24byte

除錯模式下:24+(32+4)+(42) +4 = 72//分配80byte(50h+1 = 51h),調到16的邊界

非除錯模式下:(38)+(42) = 36;//分配48

string* p = new string[3];

同理。注意:array new一定要搭配 array delete

例如:complex* p = new complex[3]; delete p;//也就是加,如果不加可能出現記憶體洩漏。是告訴編譯器要刪除的是乙個陣列,而不是乙個陣列中的首元素中的記憶體中的資料,其他的並沒有**,從而會出現記憶體洩露。

C 侯捷 堆 棧與記憶體管理

class complex complex c3 1,2 void main stack棧 是存在於魔偶作用域的一塊記憶體空間,函式本身會形成乙個stack,存放接收的引數和返回位址以及local object。c1所用的空間來自stack。器生命在作用域之內有效,會自動清理,析構函式自動呼叫。st...

C 語言程式設計 堆疊與記憶體管理

記憶體管理 動態分配記憶體 重新調整記憶體的大小和釋放記憶體 malloc 函式詳解 memset 初始化記憶體資料 程式編譯流程與 gcc 編譯器 c 語言程式設計 基本語法 c 語言程式設計 基本資料型別 c 語言程式設計 變數與常量 c 語言程式設計 運算子 c 語言程式設計 邏輯控制語句 c...

c 面試 堆疊記憶體

乙個由c c 編譯的程式占用的記憶體分為幾個部分 2 堆區 heap 一般是由程式設計師分配釋放,若程式設計師不釋放的話,程式結束時可能由os 值得注意的是他與資料結構的堆是兩回事,分配方式倒是類似於資料結構的鍊錶。3 全域性區 靜態區 static 也叫靜態資料記憶體空間,儲存全域性變數和靜態變數...