1. 程式人生 > 實用技巧 >C++學習(3)

C++學習(3)

stack(棧) heap堆

Stack,是存在於某作用於(scope)的一塊記憶體空間(memory space)、例如當你呼叫函式,函式本身即會形成一個人stack用來放置它所接受的引數。以及返回地址。棧是區域性的

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

Heap堆,或者system heap ,是指由作業系統提供的一塊global沒存空間。程式可動態分配(dynamic allocated)從某種獲得若干塊(block)

c1所佔用的空間來自於棧。

*p是個臨時物件,所佔用的空間來自於堆。生命週期結束不會自動釋放,需要自己手動釋放記憶體空間。

Stack object的生命週期:

c1便是所謂stack object,其生命在作用域(scope)結束之際結束。這種作用域內的object,又稱為auto object,因為它會被自動清空。

static local objects的生生命期

c2便是所謂static object,其生命在作用域(scope)結束之後仍然存在。直到整個程式結束。

global object的生命週期

c3便是所謂global object,其生命在整個程式結束之後才結束。你也可以把它視為一種static object,其作用域是整個程式。

heap object的生命週期

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

上面這個程式即會出現記憶體洩漏(memory leak),因為當作用域結束,p所指的heap object仍然存在,單指標p的宣告卻結束了,作用域之外再也看不到p(也就沒有機會delete p)

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

new分成三個步驟:1、分配記憶體;2、轉型。將指標轉型為特定型別。3、通過指標呼叫建構函式。

delete先呼叫dtor解構函式,再釋放記憶體

delete轉化為兩個動作:1、呼叫解構函式;2、釋放記憶體

第一步,解構函式呼叫delete釋放類內的指標。第二步呼叫delete釋放類指標。

動態分配所得的記憶體塊memory block,in VC

new 和delete 是數字new要用陣列delete

new char[] 搭配 delete[]

delete array呼叫多次解構函式,不使用delete array只調用一次解構函式。

static靜態

靜態資料和靜態函式

建立多個物件只有一個靜態資料,與物件脫離。函式都只有一份。靜態函式只能處理靜態資料

靜態資料在類內宣告,靜態資料在類的外部進行定義。

靜態函式的呼叫有兩種:1、通過物件進行呼叫;2、通過class name呼叫。

單例模式 把建構函式放入private中;

單例的改進:如果沒有人用單例。單例則不會被建立

class template模板類