最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C/C++中智能指針的用法詳解

 更新時間:2023年01月04日 10:32:23   作者:余識-  
C/C++中,指針是一個非常重要的概念,其強大但也麻煩,麻煩之處就在于一旦你申請了內(nèi)存,那就必須要手動去釋放內(nèi)容,否則就會造成內(nèi)存泄漏。所以智能指針的作用就是防止我們麻痹大意忘記釋放內(nèi)存,幫助我們管理內(nèi)存的,本文就來聊聊智能指針的用法

前言

本章主要介紹一些C/C++中智能指針的實現(xiàn)原理以及如何使用

一、什么是智能指針

C/C++中,指針是一個非常重要的概念,其強大但也麻煩

麻煩之處就在于一旦你申請了內(nèi)存,那就必須要手動去釋放內(nèi)容,否則就會造成內(nèi)存泄漏

當然了,在代碼量少的情況下你可能會不以為意,因為這點內(nèi)存即使泄露了也根本看不出來,而且一旦程序執(zhí)行結(jié)束,所有內(nèi)存都會被系統(tǒng)釋放

但如果一旦寫比較大點的項目,內(nèi)存管理就顯得很重要了,比如QQ,微信等等,一般都是一直掛著的

如果掛幾個小時就把電腦內(nèi)存耗干凈了,瞬間電腦變卡,誰還用啊

所以智能指針的作用就是防止我們麻痹大意忘記釋放內(nèi)存,幫助我們管理內(nèi)存的

當然也有多次釋放一個指針,導致程序崩潰的問題也能就此解決

二、使用方法

雖然智能指針聽著很高級,但使用起來并不算復雜,熟悉之后,其實和普通指針差別不大。但會更加好用

自C++11之后,智能指針共有三個:shared_ptr、unique_ptr、weak_ptr

1.shared_ptr

看名字就知道,它是可以分享的指針,其使用方法很簡單:

比如這里有一個類:

class User {
public:
	User() {
		cout << "這是構(gòu)造函數(shù)" << endl;
	}
	~User()
	{
		cout << "這是析構(gòu)函數(shù)" << endl;
	}

	void TestFun() {
		cout << "這是一個測試函數(shù)" << endl;
	}

};

然后使用共享智能指針:

#include<iostream>
using namespace std;
//上面的那個類可以放在這里
int main() {
	shared_ptr<User> p(new User());
	shared_ptr<User> p1 = p;
	shared_ptr<User> p2 = p;

	p->TestFun(); //調(diào)用函數(shù)的方式和指針一樣
	cout << p.use_count() << endl; //輸出共享個數(shù)
}

即:通過模板參數(shù),傳入要構(gòu)造的指針類型,然后在初始化的時候,就可以直接new一個對象即可

因為是共享的,所以它還能互相賦值,并可以用函數(shù)use_count返回當前共享的個數(shù)

其使用方法,如調(diào)用類的函數(shù)和屬性之類的,就和普通的指針一樣,用->進行調(diào)用即可,但是卻不需要我們?nèi)ビH自清理內(nèi)存了!

看,現(xiàn)在我們并沒有清理內(nèi)存,但這個類的析構(gòu)函數(shù)卻被調(diào)用了!這就說明內(nèi)存已經(jīng)被正常釋放了

這就是智能指針的好處!

但智能指針寫著有點麻煩,每次聲明其類型都有一長串,所以一般我們會對指針進行重定義,達到簡化的目的:

typedef shared_ptr<User> SPUser;
int main() {
    SPUser p(new User());
    SPUser p1 = p;
    SPUser p2 = p;
    p->TestFun(); //調(diào)用函數(shù)的方式和指針一樣
    cout << p.use_count() << endl; //輸出共享個數(shù)
}

2.unique_ptr

上面的共享指針的使用方法和普通指針區(qū)別并不大

但有時候,我們想要某個對象同時只能存在一份,即不允許像共享指針那樣,可以到處隨意賦值給別人

這時候就可以用unique_ptr,其使用方法如下:

typedef unique_ptr<User> UPUser; //重新定義一個名稱,便于使用
int main() {
	UPUser p(new User);
	//UPUser p1 = p; //錯誤,不能進行賦值
	UPUser p2;
	p2.swap(p); //但可以交換,即p2現(xiàn)在保存有變量,但p變?yōu)榱丝罩羔?
	if (p == nullptr) {
		cout << "p為空指針" << endl;
	}
	p2->TestFun(); //正常調(diào)用

	UPUser p3 = move(p2); //也可以用move函數(shù)移動
	if (p2 == nullptr) { //此時p2就是空指針
		cout << "p2為空指針" << endl;
	}
	p3->TestFun(); //p3則保存對象指針
}

可以看到,它的使用方法其實和共享指針是差不多的,唯一不同之處就是,它內(nèi)部的指針值,同一時刻只能存在一份

即,你不能對它進行任何形式的復制,但是可以移動

3.weak_ptr

這個智能指針用的不太多,因為它本身并沒有太多實際的用途,而是主要作為shared_ptr的一個輔助類存在

比如有多少指向相同的 shared_ptr 指針、shared_ptr 指針指向的堆內(nèi)存是否已經(jīng)被釋放等等。

其使用方法如下:

typedef shared_ptr<User> SPUser;
typedef weak_ptr<User> WPUser;
int main() {
	
	SPUser p(new User());
	SPUser p1 = p;
	SPUser p2 = p;

	WPUser wp(p);
	cout << wp.use_count() << endl; //查看這個共享指針使用次數(shù)
	cout << wp.expired() << endl; //判斷這個指針是否為空,或者內(nèi)存已經(jīng)被釋放

}

到此這篇關(guān)于C/C++中智能指針的用法詳解的文章就介紹到這了,更多相關(guān)C++智能指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題

    C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題

    這篇文章我們九里講講C 語言基礎(chǔ)實現(xiàn)青蛙跳臺階和漢諾塔問題,感興趣的小伙伴可以參考下面文章的具體內(nèi)容
    2021-09-09
  • C++關(guān)鍵字volatile學習筆記

    C++關(guān)鍵字volatile學習筆記

    這篇文章主要為大家介紹了C++關(guān)鍵字volatile學習筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-10-10
  • OpenCV識別圖像上的線條軌跡

    OpenCV識別圖像上的線條軌跡

    這篇文章主要為大家詳細介紹了OpenCV識別圖像上的線條軌跡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • C語言實現(xiàn)銀行管理系統(tǒng)(文件操作)

    C語言實現(xiàn)銀行管理系統(tǒng)(文件操作)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)銀行管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 關(guān)于C++的.cpp文件運行全過程

    關(guān)于C++的.cpp文件運行全過程

    這篇文章主要介紹了C++的.cpp文件運行全過程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02
  • C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內(nèi)嵌的音視頻播放器

    C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內(nèi)嵌的音視頻播放器

    這篇文章主要為大家詳細介紹了如何利用C++ Qt實現(xiàn)瀏覽器網(wǎng)頁內(nèi)嵌的音視頻播放器,并支持軟硬解碼,支持音頻,支持錄像截圖,支持多路播放等,感興趣的可以了解下
    2024-01-01
  • C++通過TerminateProess結(jié)束進程實例

    C++通過TerminateProess結(jié)束進程實例

    這篇文章主要介紹了C++通過TerminateProess結(jié)束進程實例,是Windows應(yīng)用程序設(shè)計中非常實用的技巧,需要的朋友可以參考下
    2014-10-10
  • C語言詳解函數(shù)與指針的使用

    C語言詳解函數(shù)與指針的使用

    C語言這門課程在計算機的基礎(chǔ)教學中一直占有比較重要的地位,然而要想突破C語言的學習,對函數(shù)和指針的掌握是非常重要的,本文將具體針對函數(shù)和指針的關(guān)系做詳盡的介紹
    2022-04-04
  • C語言簡明講解歸并排序的應(yīng)用

    C語言簡明講解歸并排序的應(yīng)用

    這篇文章主要介紹了 c語言排序之歸并排序,歸并就是把兩個或多個序列合并,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C語言實現(xiàn)猜數(shù)字大小的游戲

    C語言實現(xiàn)猜數(shù)字大小的游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)猜數(shù)字大小的游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-01-01

最新評論

贺州市| 察隅县| 马关县| 桐乡市| 微山县| 小金县| 锡林郭勒盟| 新巴尔虎右旗| 平远县| 伽师县| 天气| 唐海县| 精河县| 阳原县| 绥德县| 乃东县| 桂平市| 三河市| 聂拉木县| 巩义市| 津市市| 北碚区| 承德市| 丽江市| 诏安县| 横山县| 乌拉特后旗| 隆化县| 大丰市| 武功县| 江都市| 师宗县| 原平市| 舞阳县| 上杭县| 辰溪县| 观塘区| 定陶县| 台南县| 石门县| 昭平县|