12動態內存
每個程序分配有靜態內存和棧內存,還有一個內存池稱為自由空間或堆。用來存儲動態分配。
12.1動態內存與只能指針
內存泄露:旺角是否內存;引用非法內存的指針:尚有指針引用內存卻釋放了。
智能指針:shared_ptr允許多個指針指向同一個對象,unique_ptr獨占所指對象,weak_ptr弱引用指向shared_ptr。頭文件memory。
12.1.1shard_ptr類
Make_shared函數
Shared_ptr有引用計數,拷貝或者利用其初始化或者傳遞給另一個函數或者作為函數返回值引用計數都會加1。給其賦新值,或是被銷毀,或離開其作用域,計數器都會遞減。計數器為0時,就會釋放。還會釋放相關聯的內存。
12.1.2直接管理內存
Delete之后重置指針值
空懸指針,指針仍有但內存已經釋放。
12.1.3shared_ptr和new結合使用
不能進行內置指針到智能指針間的隱式轉換,必須使用直接初始化形式。
不要混合使用普通指針和智能指針,也不要使用get初始化另一個智能指針或為智能指針賦值。
14.1.4智能指針和異常
12.1.5unique_ptr
某個時刻智能有一個unique_ptr指向一個給定的對象(獨占)。
12.1.6weak_ptr
核查指針類
是用weak_ptr去初始化類成員,不會影響weak_ptr指向對象的生成期。
12.2動態數組
12.2.1new和數組
分配一個數組會得到一個元素類型的指針
如果初始化器數目小于元素數目,剩余元素將進行值初始化。如果初始化器數目大于元素數目,則new表達式失敗,不會分配內存。
動態分配一個空數組是合法的
按逆序銷毀,從后向前
可以用下標訪問。
12.2.2allocator類
allocator分配為構造的內存,要使用其返回的內存,必須用construct構造對象。使用未構造的內存,其行為是未定義的。