成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

C/C++智能指針詳解-創(chuàng)新互聯(lián)

系列文章目錄

成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒(méi)有做好網(wǎng)站,給成都創(chuàng)新互聯(lián)公司一個(gè)展示的機(jī)會(huì)來(lái)證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來(lái)新的靈感和驚喜。面向用戶(hù)友好,注重用戶(hù)體驗(yàn),一切以用戶(hù)為中心。文章目錄
  • 系列文章目錄
  • 前言
  • 一、什么是智能指針?
  • 二、使用方法
    • 1.shared_ptr
    • 2.unique_ptr
    • 3.weak_ptr


前言

對(duì)C/C++學(xué)習(xí)感興趣的可以看看這篇文章哦:C/C++教程

本章主要介紹C/C++中智能指針的使用方法

一、什么是智能指針?

C/C++中,指針是一個(gè)非常重要的概念,其強(qiáng)大但也麻煩

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

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

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

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

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

當(dāng)然也有多次釋放一個(gè)指針,導(dǎo)致程序崩潰的問(wèn)題也能就此解決

二、使用方法

雖然智能指針聽(tīng)著很高級(jí),但使用起來(lái)并不算復(fù)雜,熟悉之后,其實(shí)和普通指針差別不大。但會(huì)更加好用

自C++11之后,智能指針共有三個(gè):shared_ptr、unique_ptrweak_ptr

1.shared_ptr

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

比如這里有一個(gè)類(lèi):

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

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

};

然后使用共享智能指針:

#includeusing namespace std;
//上面的那個(gè)類(lèi)可以放在這里
int main() {shared_ptrp(new User());
	shared_ptrp1 = p;
	shared_ptrp2 = p;

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

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

因?yàn)槭枪蚕淼?,所以它還能互相賦值,并可以用函數(shù)use_count返回當(dāng)前共享的個(gè)數(shù)

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

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

這就是智能指針的好處!

但智能指針寫(xiě)著有點(diǎn)麻煩,每次聲明其類(lèi)型都有一長(zhǎng)串,所以一般我們會(huì)對(duì)指針進(jìn)行重定義,達(dá)到簡(jiǎn)化的目的:

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

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

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

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

typedef unique_ptrUPUser; //重新定義一個(gè)名稱(chēng),便于使用
int main() {UPUser p(new User);
	//UPUser p1 = p; //錯(cuò)誤,不能進(jìn)行賦值
	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ù)移動(dòng)
	if (p2 == nullptr) {//此時(shí)p2就是空指針
		cout<< "p2為空指針"<< endl;
	}
	p3->TestFun(); //p3則保存對(duì)象指針
}

在這里插入圖片描述

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

即,你不能對(duì)它進(jìn)行任何形式的復(fù)制,但是可以移動(dòng)

3.weak_ptr

這個(gè)智能指針用的不太多,因?yàn)樗旧聿](méi)有太多實(shí)際的用途,而是主要作為shared_ptr的一個(gè)輔助類(lèi)存在

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

其使用方法如下:

typedef shared_ptrSPUser;
typedef weak_ptrWPUser;
int main() {	SPUser p(new User());
	SPUser p1 = p;
	SPUser p2 = p;

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

}

在這里插入圖片描述

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

當(dāng)前標(biāo)題:C/C++智能指針詳解-創(chuàng)新互聯(lián)
分享URL:http://jinyejixie.com/article2/djsoic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)、網(wǎng)站改版、建站公司企業(yè)建站、商城網(wǎng)站、云服務(wù)器

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)
永川市| 巫山县| 盐城市| 奇台县| 巩义市| 丹寨县| 德庆县| 鹿邑县| 开原市| 金沙县| 靖宇县| 商南县| 资中县| 桐柏县| 永昌县| 麻城市| 拜城县| 营口市| 徐水县| 新野县| 永福县| 福州市| 崇州市| 会理县| 五莲县| 昭通市| 水城县| 铁岭县| 白城市| 任丘市| 沂南县| 乐陵市| 江源县| 安多县| 大冶市| 阿巴嘎旗| 郓城县| 永平县| 仙桃市| 绥棱县| 中山市|