亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

前言

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

一、什么是智能指針

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_ptr、weak_ptr

1.shared_ptr

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

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

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

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

};

然后使用共享智能指針:

#include<iostream>
using namespace std;
//上面的那個(gè)類可以放在這里
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; //輸出共享個(gè)數(shù)
}

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

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

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

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

這就是智能指針的好處!

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

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; //輸出共享個(gè)數(shù)
}

2.unique_ptr

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

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

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

typedef unique_ptr<User> UPUser; //重新定義一個(gè)名稱,便于使用
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è)輔助類存在

比如有多少指向相同的 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; //查看這個(gè)共享指針使用次數(shù)
	cout << wp.expired() << endl; //判斷這個(gè)指針是否為空,或者內(nèi)存已經(jīng)被釋放

}

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

相關(guān)文章

  • C++實(shí)現(xiàn)迷宮游戲

    C++實(shí)現(xiàn)迷宮游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 解決了個(gè)困擾了2天的問(wèn)題,定點(diǎn)運(yùn)算問(wèn)題

    解決了個(gè)困擾了2天的問(wèn)題,定點(diǎn)運(yùn)算問(wèn)題

    本文主要講解定點(diǎn)運(yùn)算問(wèn)題,需要的朋友可以參考一下。
    2016-06-06
  • OpenCV外接USB攝像頭的方法

    OpenCV外接USB攝像頭的方法

    這篇文章主要為大家詳細(xì)介紹了OpenCV外接USB攝像頭的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • C++ 私有析構(gòu)函數(shù)的作用示例詳解

    C++ 私有析構(gòu)函數(shù)的作用示例詳解

    這篇文章主要介紹了C++ 私有析構(gòu)函數(shù)的作用,私有析構(gòu)函數(shù)不會(huì)影響棧上對(duì)象的自動(dòng)析構(gòu),它們會(huì)在其作用域結(jié)束時(shí)自動(dòng)調(diào)用析構(gòu)函數(shù)。私有析構(gòu)函數(shù)主要影響的是對(duì)堆上對(duì)象的顯式刪除操作,需要的朋友可以參考下
    2023-06-06
  • C++ seekg函數(shù)用法案例詳解

    C++ seekg函數(shù)用法案例詳解

    這篇文章主要介紹了C++ seekg函數(shù)用法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C++實(shí)現(xiàn)五子棋小游戲

    C++實(shí)現(xiàn)五子棋小游戲

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)五子棋小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單反彈球消磚塊游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單反彈球消磚塊游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單反彈球消磚塊游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • C++繼承介紹

    C++繼承介紹

    C++繼承可以是單一繼承或多重繼承,每一個(gè)繼承連接可以是public,protected,private也可以是virtual或non-virtual
    2013-01-01
  • C語(yǔ)言中bool變量的深入理解

    C語(yǔ)言中bool變量的深入理解

    C語(yǔ)言中沒(méi)有BOOL類型變量,它是C++獨(dú)有的,由于使用BOOL類型可以使代碼更具有可讀性,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中bool變量的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言采用文本方式和二進(jìn)制方式打開(kāi)文件的區(qū)別分析

    C語(yǔ)言采用文本方式和二進(jìn)制方式打開(kāi)文件的區(qū)別分析

    這篇文章主要介紹了C語(yǔ)言采用文本方式和二進(jìn)制方式打開(kāi)文件的區(qū)別分析,有助于讀者更好的理解文本文件與二進(jìn)制文件的原理,需要的朋友可以參考下
    2014-07-07

最新評(píng)論