C 學習筆記6 記憶體的堆疊分配

2021-08-26 12:27:27 字數 1699 閱讀 7577

//所謂stack(棧),所謂heap(堆)

stack,是存在於某作用域(scope)的乙個記憶體空間(memory space)。例如當你呼叫函式,函式本身即會形成乙個stack用來放置它所接受的引數

,以及返回位址。

在函式本體(function body)內宣告的任何變數,其所使用的記憶體都取自上述stack。

heap,或叫system heap,是指擁由作業系統提供的乙個global記憶體空間,程式可動態分配(dynamic allocated)從其中獲得若干區塊(blocks)。

class complex;

function()

//c1所占用的空間來自stack,在函式呼叫結束後會自動銷毀,但p的記憶體是通過new在heap中獲得的,在函式呼叫結束後是不會自動銷毀的,只能通過 delet手動銷毀

//c1是所謂的stack object,其生命在作用域(scope)結束之後結束。這種作用域內的object,又稱為auto object,因為它會被[自動]清除,就是析構函式會自動被呼叫。

//static local objects的生命期

class complex;

function()

//c2便是所謂的static object,其生命在作用域(scope)結束時候仍然存在,直到整個程式結束。即析構函式在程式結束後才呼叫

//flobal objects的生命期

class complex;

...complex c3(1, 2);

int main()

//c3便是所謂的global object,其生命期在整個程式結束之後才結束。你也可以把她視為乙個static object,其作用域是[整個程式]

//heap objects的生命期

class complex;

...function()

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

class complex;

...function()

//以上出現記憶體洩漏(memory leak),因為當作用域結束,p所指的heap object仍然存在,但指標p的生命卻結束了,作用域之外再也看不到p(也就沒有delete p)

//new:先分配memory,再呼叫建構函式

1.分配記憶體。

2.把記憶體轉化為相應的資料型別。

3.給這塊記憶體賦值

//delete:先呼叫析構函式,再釋放memory(以string類為例)

1.呼叫析構函式,銷毀動態分配的字串的記憶體。

2.釋放string類的memory,銷毀string類內的字串指標

//在string類中的建構函式和析構函式中,我們使用了new char[strlen(cstr)+1]和delete,這兩個函式教array new和array delete

//array new要搭配array delete

//eg: string* p = new string[3];

delete p;

//這麼寫,只呼叫了一次析構函式,即new出來的三個指標的記憶體被**了,但是第二個,第三個指標指向的那兩塊記憶體卻洩露了

//不過話說回來,比如complex類,用*p = new complex[3]和delete p是不存在記憶體洩露的,但我們最好不要那樣寫

C 堆疊以及記憶體分配

乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類...

堆疊的記憶體分配

記憶體分配 遇到的問題 最近工作中遇到乙個bug,log顯示剛開始從buf中讀取的內容是正確的,但是將不同的指標指向buf中不同的起始位址,然後經過一些操作後,重新讀取這些指標指向的內容,發現內容不正確了。void cheange char name,char type char tmp sep i...

C語言學習 6 記憶體分配

一 傳統陣列的缺點 1 陣列的長度必須事先定製,且只能是常整數,不能是變數 intlen 5 inta len error 2 傳統形式定義的陣列,該程式的記憶體程式設計師無法手動釋放 include void f void 這二十個位元組的儲存空間程式設計師無法手動程式設計釋放它 只能在本函式執行...