unique_ptr
unique_ptr
是唯一指標, 如果有這個指標進行包裝其他的指標,當這個指標變數拷貝的時候會出現錯誤, 這是因為這個指標是唯一的,不允許被複製
int
main()
p1 會出現錯誤
shared_ptr
shared_ptr
是共享指標,它允許多個指標指向同乙個記憶體, 可以被複製,每當複製一次,記憶體的指向數+1 當 記憶體指向數為0的時候會自動**記憶體空間
但是,當shared_prt 被當做類的屬性的時候, a類指向了b類,b類也有個屬性,指向了a類, 這時候的物件相互指向就不能被自動**了,因為記憶體的引用數永遠大於0了,所以,謹慎所有shared_ptr 當做類的屬性,
class teacher};
class stu
};
如上,這兩個類就是相互指向了, 這樣的話它的例項物件是無法自動**的,如何解決相互指向呢,
可以使用 弱指標weak_ptr
weak_ptr
weak_ptr
弱指標, 它可以包裝shared_ptr ,並且使用 弱指標 時,記憶體指向是不會增加的, 一般配合shared_ptr 使用,
class teacher
~teacher()
void
setstu
(shared_ptr p_s)};
class stu
virtual ~
stu(
)void
setteacher
(shared_ptr p_t)
};
將任意乙個類中類屬性設定為弱指標型別, 因為弱指標是不會增加記憶體引用計數的,當程式執行完後,stu 類由於沒有類指向它了,會自動釋放**記憶體空間, 因為stu 類的記憶體被**了, shared_ptr 就相當於也被**了, 所以teacher 類 也被**了
注意,不能使用智慧型指標包裝棧記憶體的指標, 因為指標會隨著程式結束而自動釋放**, 這時候,因為是棧記憶體,所以記憶體空間又被**一次, 相當於 重複 delete ,這樣是會造成重複**的錯誤
記憶體分割槽
棧區:又叫堆疊,儲存非靜態區域性變數、函式引數、 返回值等,棧是可以向下生長的
共享記憶體區:是高效的i/o對映方式,用於裝載乙個共享的動態記憶體庫。使用者可使用系統介面建立共享共享內 存,做程序間通訊
堆區:用於程式執行時動態記憶體分配,堆是可以向上增長的
靜態區:儲存全域性資料和靜態資料
**區:儲存可執行的**、唯讀常量
巨集 變數跟常量有點類似,都不能修改值,
巨集變數的作用是將後的資料替換為後變數中,如
int
main()
可以將int 型別 放到巨集變數aaa 中,然後在下面呼叫a 變數的時候可以將 aaa 當做int 來使用,巨集變數的作用就是替換, 將 aaa 替換為 int
條件巨集可以判斷c++的版本是否是11 或 14 ,當c++版本是11 時可以使用這個方法,當c++ 版本小於11 時,不允許使用這個方法,也可以判斷當前程式的執行模式,如果是debug 則執行這個方法,如果是普通的執行,則執行另乙個方法
列舉列舉就是限制你使用的資料 ,類似於資料類中的列舉,要給這個變數賦值,只能從這個列舉中選乙個,不能是列舉型別外的資料,如,我定義乙個性別的變數,如果是string 的話,可以是 「男」 「女」 「男生」 「女生」, 因為性別只要男,女兩種, 使用可以將變數定義為列舉型別變數,這樣就可以限制隨便輸入了,
int
main()
; gender gender;
gender = man;
// gender = "few";
return0;
}
如上, 如果gender 變數 不是列舉型別gender中的資料的話就會出錯,這樣就可以對變數進行限制了
限定作用域
列舉分為限制作用域和不限制作用域,限制作用域是通過 class 或 strict 來進行定義的,
enum class week
;week week = (int)week:
:tus ;
這種列舉值位於enum
的區域性作用域內,列舉值不會隱式的轉化成其他型別
不限定作用域
enum week
;week week = tus ;
不限制作用域的話列舉值會隱式的轉化成整數, 不過不限定作用域的話不能出現同名的列舉值,如果出現了就會出現分不清這個列舉值是哪個列舉變數中的,會產生錯誤,相當於變數重名 自學C day13 記憶體管理
定義在函式內部的變數 作用域 從定義位置開始到包裹該變數的第乙個右大括號結束 定義在全域性變數位置 定義語法 在區域性變數定義之前新增static關鍵字 特性 靜態區域性變數只定義一次,在全域性位置,通常用來做計數器 作用域 從定義位置開始到包裹該變數的第乙個右大括號結束 就是常說的函式 定義語法 ...
智慧型指標 強弱智慧型指標
在平時編寫 的時候經常會用到new來開闢空間,而我們開闢出來的空間必須得手動去delete他,但是如果程式設計師忘記去手動釋放那邊會出現乙個麻煩的問題,記憶體洩漏!或者是一塊記憶體被多個函式同時使用時,如果其中乙個函式不知道還有其他人也在使用這塊記憶體而釋放掉的話同樣也會引起程式的崩潰。引起記憶體洩...
c day13 多型 虛析構 過載重寫重析構
如果不寫virtual關鍵字會是靜態鏈結編譯 includeusing namespace std class a protected private class b protected private class c public a protected private 封裝,封裝突破c函式的概念...