天天看點

侯捷c++課程 string類 筆記

class with pointer members

由于字元串的長度是不确度的,是以使用數組來存放字元串,不好确定數組大小

是以選擇使用char* 動态配置設定記憶體的方式來存儲

字元串string類的資料成員隻有一個char* 指針,通過動态配置設定記憶體指向字元串

帶有指針的類有三個特殊函數 析構函數 複制構造函數 operator =

不能使用編譯器自動生成的operator =和複制構造函數,這些函數是直接的bit by bit 的指針指派

會造成記憶體洩漏,即内容還在那裡,沒有被回收,但沒有指針指向這裡

同時會形成兩個指針指向同一塊記憶體區域,當一個指針delete後,另外一個也會受影響(alias)

首先擷取參數的字元長度,由于strlen傳回的長度不包括結尾的'\0',是以要配置設定的記憶體空間要strlen(cstr)+1

在正常的構造函數中,即使指針參數為空指針,也要配置設定一個char的記憶體空間,内容為'\0'

調用strcpy複制,自動複制結尾的'\0'

當string類的執行個體對象的作用域結束後,os會收回其所占用的記憶體空間

但string類的資料隻有一個指針,這個指針所指向的内容是不會自動回收的,是以要在析構函數中手動delete

實作和複制構造函數類似,但是要先清空自身内容,再進行指派

要判定自我指派的情況,如果不判斷,将直接清空自身的内容,指針成為野指針,會發生undefined behavior

在函數function body内聲明的變量,記憶體來自于stack

heap是os提供的一塊global記憶體空間,可通過new進行動态配置設定記憶體

stack object在作用域結束後被自動清理 而heap object仍然存在

在變量聲明前加static關鍵字,即為static object,其在作用域結束後仍然存在,直到整個程式結束

global object也可看作一種static object,作用域是整個程式

new被編譯器轉化為三個步驟:

1.調用malloc配置設定記憶體

2.static_cast類型轉換

3.調用構造函數

delete為兩個步驟:

1.調用析構函數

2.調用free釋放記憶體

delete 和 delete[] 都會将其所指的記憶體塊全部釋放

差別在于delete[]會對數組内的每一個元素調用析構函數 而delete隻對第一個元素調用

如果數組元素為帶有指針成員的類,使用delete會造成memory leak