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模板類