//所謂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 這二十個位元組的儲存空間程式設計師無法手動程式設計釋放它 只能在本函式執行...