最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

附錄 | BUG踩坑----智能指針

2020-03-31 23:56 作者:有木乘舟  | 我要投稿

指針和智能指針

? 在c/c++中有一個很重要的概念,管理內(nèi)存地址,即手動為數(shù)據(jù)分配內(nèi)存,從而誕生了指針這一概念。

? 指針是一個變量,其存儲的是值的地址。

? 我們在聲明了一個指針變量后,會在自由存儲區(qū)為該變量開辟內(nèi)存空間,以供后來使用。

? 指針的強大之處在于它可以自由的分配和管理內(nèi)存,但也因此容易引發(fā)內(nèi)存泄漏的問題。

? 所謂的內(nèi)存泄露,指的是不再使用的內(nèi)存空間,未被及時的釋放和回收。

? 大約有以下幾種內(nèi)存泄露的情況:

  • 為指針分配堆中的內(nèi)存,但沒有回收。即沒有delete掉這個指針。

  • 在回收指針前,程序因為其他原因提前結(jié)束。比如異常拋出的情況。

  • 沒有將基類的析構(gòu)函數(shù)定義為虛函數(shù)。這種情況主要發(fā)生在聲明了一個基類指向子類的指針被錯誤釋放,而導(dǎo)致的內(nèi)存泄露問題。

  • 野指針:指向指向被釋放的或者訪問受限內(nèi)存的指針。主要原因還是在于空指針沒有被置為NULL。

? 為了有效、方便的避免這些問題,c++11后提出了新的智能指針 shared_ptr、unique_ptr和weak_ptr,這三種智能指針模板類來管理指針。

? 智能指針本質(zhì)上是模板類,是對象,可以將new獲得的地址賦給這種對象,當智能指針過期時,其析構(gòu)函數(shù)將使用delete來釋放內(nèi)存。?

普通指針和智能指針的對比

??注意,所有智能指針的構(gòu)造函數(shù)均為 explicit構(gòu)造函數(shù),該關(guān)鍵字作用是取消隱式轉(zhuǎn)換,并且只能有一個參數(shù)(如果其他參數(shù)有初始值也可以)。

? 也就是說,你不能用以下這種方式來賦值指針:

? unique_ptr:

? 它對其所指向的對象擁有獨享權(quán),unique_ptr 不共享它所管理的對象。

? 多個指針無法指向同一個對象。

? 它無法通過直接賦值的方式來傳遞對象,只能通過引用的方式,或者通過 std::move(所有權(quán)轉(zhuǎn)移)的方式來傳遞對象。傳遞完成后,原本的指針將變成空指針。

? 另一種情況,用函數(shù)返回一個 unique_ptr指針也是可以的,因為這個指針是臨時指針,在使用完之后會被自動釋放。但是這需要滿足另一個指針也是 unique_ptr 才可以。

??還有一種情況,在 unique_ptr 為右值時,可以將其賦值給 shared_ptr。這是因為 shared_ptr有一個顯式構(gòu)造函數(shù)。

shared_ptr:

??shared_ptr 是一個標準的共享所有權(quán)的智能指針,允許多個指針指向同一個對象。

? 它含有計數(shù)功能,通過 shared_ptr.use_count()?可以得到當前對象被多少個指針共享。

? 當一個shared_ptr賦值給另一個shared_ptr時,被賦值的指針的原內(nèi)存會被銷毀,回收。

附錄 | BUG踩坑----智能指針的評論 (共 條)

分享到微博請遵守國家法律
吴忠市| 台北市| 中江县| 昌黎县| 木兰县| 滦平县| 新和县| 自治县| 沂水县| 江门市| 北宁市| 新源县| 双牌县| 苏尼特右旗| 射阳县| 嘉义市| 阿巴嘎旗| 渭南市| 日照市| 鹿泉市| 田林县| 涿鹿县| 湖南省| 托里县| 体育| 益阳市| 科技| 鱼台县| 榆中县| 鄂托克旗| 赫章县| 冀州市| 望江县| 宜良县| 承德市| 叶城县| 游戏| 大石桥市| 柘荣县| 隆回县| 阳江市|