国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

智能指針:C++中優(yōu)雅的內(nèi)存管理解決方案

這篇具有很好參考價(jià)值的文章主要介紹了智能指針:C++中優(yōu)雅的內(nèi)存管理解決方案。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

智能指針:C++中優(yōu)雅的內(nèi)存管理解決方案

前言

歡迎來到??小K??的??C++專欄??,內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況,這是C和C++程序員的噩夢之一。本節(jié)將為大家?guī)斫鉀Q辦法—>智能指針

智能指針:C++中優(yōu)雅的內(nèi)存管理解決方案

1、簡介

?智能指針是一個(gè)模板類,封裝了裸指針,可以對指針進(jìn)行安全的操作。

  • 使用RAII特點(diǎn),將對象生命周期使用棧來管理
  • 智能指針區(qū)分了所有權(quán),因此使用責(zé)任更為清晰
  • 智能指針大量使用操作符重載和函數(shù)內(nèi)聯(lián)特點(diǎn),調(diào)用成本和裸指針無差別

2、為什么要使用智能指針

?一句話:智能指針就是幫我們C++程序員管理動(dòng)態(tài)分配的內(nèi)存的,它會(huì)幫助我們自動(dòng)釋放new出來的內(nèi)存,從而避免內(nèi)存泄漏!

?內(nèi)存泄漏指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況,這是C和C++程序員的噩夢之一。

3、unique_ptr

?unique_ptr是一種定義在中的智能指針(smart pointer)。它持有對對象的獨(dú)有權(quán)——兩個(gè)unique_ptr不能指向一個(gè)對象,不能進(jìn)行復(fù)制操作只能進(jìn)行移動(dòng)操作。

?unique_ptr對象是管理的對象的唯一擁有者:因?yàn)楫?dāng)unique_ptr對象釋放時(shí)會(huì)刪除它們的托管對象,而不考慮其他指針是否仍然指向相同的對象,從而使指向那里的其他指針指向無效的位置。

?unique_ptr對象復(fù)制了有限的指針功能,通過操作符*和->(用于單個(gè)對象)或操作符[](用于數(shù)組對象)提供對其托管對象的訪問。出于安全考慮,它們不支持指針?biāo)阈g(shù)運(yùn)算,只支持移動(dòng)賦值(禁用復(fù)制賦值)。

?下面是基本的使用方法

void testOne() 
{
	unique_ptr<int> p(new int(1234));
	cout << *p << endl;
	unique_ptr<int> p1;
	//p1 = p;                     錯(cuò)誤,不能賦值和拷貝
	//unique_ptr<int> p2(p);
	p1 = move(p);           //轉(zhuǎn)交所有權(quán)
	cout << *p1 << endl;
	//cout << *p << endl;   //錯(cuò)誤,p已經(jīng)失去了管理對象

	unique_ptr<int> p3(new int(897));
	p3.reset(p1.release());
	cout << *p3 << endl;
}

?需要手動(dòng)寫刪除器的情況,一般是操作自定義類型(且注意unique_ptr的刪除器寫法的,需要手動(dòng)寫入刪除器類型)

class MM {
public:
	~MM() {
		cout << "調(diào)用析構(gòu)函數(shù)成功" << endl;
	}
};
void testTwo() 
{
	//unique_ptr刪除器寫法,需要手動(dòng)寫入刪除器類型
	unique_ptr<MM,void(*)(MM*&)> Pmm(new MM[4], [](MM*& pmm) {delete[] pmm; });
}

?注意當(dāng)函數(shù)參數(shù)為unique_ptr類型時(shí),需要使用引用,因?yàn)榇祟愋褪仟?dú)享型,禁止拷貝

void print(unique_ptr<int>& p) 
{
	cout << *p << endl;
}

4、shared_ptr

?unique_ptr是一個(gè)獨(dú)享指針,同一時(shí)刻只能有一個(gè)unique_ptr指向一個(gè)對象,而shared_ptr是一個(gè)共享指針,同一時(shí)刻可以有多個(gè)shared_ptr指向同一對象,但會(huì)記錄有多少個(gè)shared_ptr共同指向一個(gè)對象。這便是所謂的引用計(jì)數(shù)(reference counting)。

? 一旦最后一個(gè)這樣的指針被銷毀,也就是一旦某個(gè)對象的引用計(jì)數(shù)變?yōu)?,這個(gè)對象會(huì)被自動(dòng)刪除。這在非環(huán)形數(shù)據(jù)結(jié)構(gòu)中防止資源泄露很有幫助。

?基本用法

void testOne() 
{
	shared_ptr<int> p1; //無參構(gòu)造
	if (!p1) 
	{
		cout << "空的智能指針對象" << endl;
	}
	shared_ptr<int> p2(new int(1234));
	//shared_ptr<int> p2 = new int(1234); 錯(cuò)誤

	shared_ptr<int> p3 = make_shared<int>(1234);  //使用make_shared不支持創(chuàng)建數(shù)組
	//怎么訪問數(shù)據(jù),直接把智能指針對象當(dāng)做指針來用
	cout << *p3 << endl;
	//cout << p3[0] << endl; 錯(cuò)誤,沒有下標(biāo)的使用方式

	//獲取管理對象原生指針
	int* k = p3.get();
	cout << *k << endl;
	cout << k[0] << endl;
	//注意:千萬不要手動(dòng)釋放原生指針,否則會(huì)中斷(釋放兩次)
	//delete k;

	cout << "管理對象數(shù):" << p3.use_count() << endl;
	shared_ptr<int> p4(p3);
	cout << "管理對象數(shù):" << p3.use_count() << endl;

}

?vector管理普通指針的弊端

class MM 
{
public:
	MM(string name="",int age=0):name(name),age(age){}
	void print() 
	{
		cout << name << "\t" << age << endl;
	}
	~MM() 
	{
		cout << "調(diào)用析構(gòu)函數(shù)" << endl;
	}
protected:
	string name;
	int age;
};
void testTwo() 
{
	cout <<"-----------------------------------" << endl;
	shared_ptr<MM> p(new MM("name1", 19));
	p->print();

	/*****************vector弊端*****************/
	vector<MM*> p1;
	p1.push_back(new MM("name", 20));
	//p1.pop_back();
	p1.clear();
	//可以看到pop和clear函數(shù)都不會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)---->當(dāng)vector操作自定義類型指針的時(shí)候
	/*******************************************/

	//比較常用的用法--->工作中
	vector<shared_ptr<MM>> arr;
	shared_ptr<MM> p2(new MM("name"));
	p2->print();
	arr.push_back(p2);
}

上面代碼中,當(dāng)vector管理MM*類型的時(shí)候,并不會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),這時(shí)候我們只需要讓vector管理shared_ptr就好了

?需要手動(dòng)寫刪除器的情況,和unique_ptr一樣

void testThree() 
{
	cout << "-----------------------------------" << endl;
	shared_ptr<int> king(new int[4] {1, 2, 3, 4});
	int* pNum = king.get();
	for (int i = 0; i < 4; i++)
	{
		cout << pNum[i] << " ";
	}
	cout << endl;

	//當(dāng)操作特殊類型(自定義類型,c語言文件的打開)的時(shí)候,需要手動(dòng)寫刪除器
	shared_ptr<MM> p1(new MM[4], [](MM*& pmm) {delete[]pmm; });
	shared_ptr<FILE> pfile(fopen("1.txt", "w+"), [](FILE*& file) {free(file); });
}

?當(dāng)shared_ptr當(dāng)函數(shù)參數(shù)和返回值的時(shí)候,正常寫就ok

void pprint(shared_ptr<MM>& mm) {
	mm->print();
}
shared_ptr<int> returnpoint(int num) {
	return shared_ptr<int>(new int(num));
}

5、weak_ptr

?shared_ptr可以用來避免內(nèi)存泄漏,可以自動(dòng)釋放內(nèi)存。但是在使用中可能存在循環(huán)引用,使引用計(jì)數(shù)失效,從而導(dǎo)致內(nèi)存泄漏的情況。如下代碼所示:

class B;
class A {
public:
	~A() {
		cout << "A" << endl;
	}
	shared_ptr<B> a;
};
class B {
public:
	~B() {
		cout << "B" << endl;
	}
	shared_ptr<A> b;
};
void testOne() 
{
	shared_ptr<A> ao(new A);
	shared_ptr<B> bo(new B);
	ao->a = bo;
	bo->b = ao;
}

我們發(fā)現(xiàn)上面的一段代碼中,ao中的指針管理bo,bo中的指針管理ao,形成了循環(huán)管理,這時(shí)候就不會(huì)自動(dòng)釋放。這時(shí)候我們只需要把shared_ptr改為weak_ptr就ok了

?基本處理

weak_ptr只能從shared_ptr或者已有的weak_ptr去構(gòu)造,不能直接管理對象
不能直接訪問管理的對象,訪問數(shù)據(jù)要通過lock()函數(shù)去訪問shared_ptr,然后再去訪問數(shù)據(jù)文章來源地址http://www.zghlxwxcb.cn/news/detail-457596.html

void testTwo() 
{
	shared_ptr<int> p(new int(1234));
	cout << "count:" << p.use_count() << endl;
	weak_ptr<int> w(p);
	cout << "count:" << w.use_count() << endl;
	weak_ptr<int> w2(w);
	cout << "count:" << w2.use_count() << endl;
	cout << *w.lock() << endl;
	shared_ptr<int> k = w2.lock();
	cout << *k << endl;
}

到了這里,關(guān)于智能指針:C++中優(yōu)雅的內(nèi)存管理解決方案的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 智能資產(chǎn)管理的安全挑戰(zhàn)與解決方案

    智能資產(chǎn)管理(Smart Asset Management,SAM)是一種利用人工智能(AI)和大數(shù)據(jù)技術(shù)來優(yōu)化資產(chǎn)管理過程的方法。它涉及到資產(chǎn)跟蹤、資產(chǎn)分析、資產(chǎn)預(yù)測和資產(chǎn)優(yōu)化等方面。隨著資產(chǎn)管理的復(fù)雜化和數(shù)據(jù)量的增加,智能資產(chǎn)管理的安全性變得越來越重要。 在智能資產(chǎn)管理中,資產(chǎn)可

    2024年02月22日
    瀏覽(16)
  • 智能管理護(hù)航制造企業(yè)安全生產(chǎn):信息化升級(jí)解決方案解析-億發(fā)

    智能管理護(hù)航制造企業(yè)安全生產(chǎn):信息化升級(jí)解決方案解析-億發(fā)

    安全生產(chǎn)信息化是通過充分利用信息技術(shù),及時(shí)采集安全生產(chǎn)管理中的各種要素和數(shù)據(jù),并進(jìn)行統(tǒng)計(jì)分析,隨后將分析結(jié)果及時(shí)反饋,以實(shí)現(xiàn)對安全生產(chǎn)管理的指導(dǎo)和幫助,旨在提高安全生產(chǎn)管理的效能。 在提升安全生產(chǎn)管理水平方面,加強(qiáng)安全生產(chǎn)信息化平臺(tái)建設(shè)顯得尤為

    2024年01月19日
    瀏覽(95)
  • Kali 無法聯(lián)網(wǎng)的解決方案,優(yōu)雅的配置橋接模式

    Kali 無法聯(lián)網(wǎng)的解決方案,優(yōu)雅的配置橋接模式

    打開虛擬網(wǎng)絡(luò)編輯器: 更改設(shè)置: 將VMnet0網(wǎng)卡配置為橋接模式,其中已橋接至應(yīng)選擇你的電腦的網(wǎng)卡(可以通過WIFI屬性查看): 編輯虛擬機(jī)設(shè)置,繼續(xù)修改網(wǎng)絡(luò)設(shè)備器為橋接模式: 說在前面:有些大學(xué)的校園網(wǎng)是無法動(dòng)態(tài)分配多個(gè)IP的,所以在實(shí)驗(yàn)過程中,還是會(huì)出現(xiàn)無法

    2023年04月10日
    瀏覽(18)
  • vue3+vite2動(dòng)態(tài)綁定圖片優(yōu)雅解決方案

    vue3+vite2動(dòng)態(tài)綁定圖片優(yōu)雅解決方案

    優(yōu)雅解決方案在最下面,小伙伴們兒可以直接前往 ?? 在vue3+vite2項(xiàng)目中,我們有時(shí)候想要?jiǎng)討B(tài)綁定資源,比如像下面的代碼這樣: 實(shí)際效果是這樣: 我們注意到,控制臺(tái)的報(bào)錯(cuò)信息 GET http://127.0.0.1:5173/1.jpg 404 (Not Found) GET :表示向服務(wù)器請求資源的方式。 http://127.0.0.1:5173

    2024年02月11日
    瀏覽(97)
  • Spring Boot 項(xiàng)目優(yōu)雅關(guān)閉(兩種完善解決方案附帶示例代碼)

    Spring Boot 項(xiàng)目優(yōu)雅關(guān)閉(兩種完善解決方案附帶示例代碼)

    Spring Boot 項(xiàng)目優(yōu)雅關(guān)閉常用兩種方案,一種是使用 kill -2 和 -15 發(fā)送程序終止信號(hào),另一種是使用 spring-boot-actuator 包提供一個(gè)優(yōu)雅下線接口,這兩種方案根據(jù)自己喜好來,萬不得已別用 kill -9 就行,個(gè)人推薦第一種,對于Spring Boot 項(xiàng)目來說兩種方法只是入口不同,最終關(guān)閉邏

    2024年02月03日
    瀏覽(28)
  • 會(huì)議預(yù)約管理系統(tǒng),智慧會(huì)議室,智能會(huì)議室解決方案,聯(lián)動(dòng)會(huì)議門牌顯示屏,提供會(huì)議室的使用效率

    會(huì)議預(yù)約管理系統(tǒng),智慧會(huì)議室,智能會(huì)議室解決方案,聯(lián)動(dòng)會(huì)議門牌顯示屏,提供會(huì)議室的使用效率

    會(huì)議室預(yù)約管理系統(tǒng)主要用于實(shí)現(xiàn)會(huì)議室的信息化管理,如在線預(yù)約會(huì)議室/查看會(huì)議室的使用情況,通過會(huì)議室門口的電子終端顯示屏實(shí)時(shí)展示當(dāng)前會(huì)議室狀態(tài),如會(huì)議室現(xiàn)在的使用狀態(tài),會(huì)議主題,會(huì)議預(yù)約人,會(huì)議時(shí)間及該會(huì)議室近期的會(huì)議情況,預(yù)約使用時(shí)間等,方便

    2024年02月05日
    瀏覽(24)
  • vue3探索——vue3+vite2動(dòng)態(tài)綁定圖片優(yōu)雅解決方案

    vue3探索——vue3+vite2動(dòng)態(tài)綁定圖片優(yōu)雅解決方案

    優(yōu)雅解決方案在最下面,小伙伴們兒可以直接前往 ?? 在vue3+vite2項(xiàng)目中,我們有時(shí)候想要?jiǎng)討B(tài)綁定資源,比如像下面的代碼這樣: 實(shí)際效果是這樣: 我們注意到,控制臺(tái)的報(bào)錯(cuò)信息 GET http://127.0.0.1:5173/1.jpg 404 (Not Found) GET :表示向服務(wù)器請求資源的方式。 http://127.0.0.1:5173

    2024年02月10日
    瀏覽(89)
  • SpringBoot Maven 項(xiàng)目打包的藝術(shù)--主清單屬性缺失與NoClassDefFoundError的優(yōu)雅解決方案

    SpringBoot Maven 項(xiàng)目打包的藝術(shù)--主清單屬性缺失與NoClassDefFoundError的優(yōu)雅解決方案

    這兩個(gè)問題的出現(xiàn)場景是,你打包完一個(gè)SpringBoot、Maven項(xiàng)目,上傳Jar包到服務(wù)器運(yùn)行的時(shí)候遇到的。也算是比較經(jīng)典的兩個(gè)問題了,如果你在打包項(xiàng)目的時(shí)候,很容易遇到,這篇文章就是用來一勞永逸地解決它們。 1.1、Jar包運(yùn)行:沒有主清單屬性 解決方案 其實(shí)這個(gè)問題主要

    2024年04月14日
    瀏覽(29)
  • SpringBoot單元測試報(bào)空指針異常解決方案

    SpringBoot單元測試報(bào)空指針異常解決方案

    java.lang.NullPointerException空指針異常 1.測試類中產(chǎn)生空指針異常,可能不是你的邏輯代碼寫錯(cuò)了,而是因?yàn)楂@取容器失敗,即沒有使用正確的測試方法 2.在SpringBoot項(xiàng)目中我們一般可以使用兩種Junit進(jìn)行測試,在導(dǎo)入@Test包時(shí),會(huì)出現(xiàn)兩個(gè)選項(xiàng) (1)import org.junit.Test; 該junit需要在

    2024年02月11日
    瀏覽(16)
  • 【前端】內(nèi)存泄露及解決方案

    內(nèi)存泄漏是指在程序運(yùn)行時(shí),分配的內(nèi)存沒有被正確釋放,導(dǎo)致內(nèi)存空間的浪費(fèi),最終可能會(huì)導(dǎo)致程序崩潰或運(yùn)行緩慢。 內(nèi)存泄漏通常是由于程序員在代碼中使用不當(dāng)?shù)膬?nèi)存管理技術(shù)或者邏輯錯(cuò)誤導(dǎo)致的。例如,程序員可能會(huì)忘記釋放不再需要的內(nèi)存塊,或者使用了錯(cuò)誤的內(nèi)

    2024年02月16日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包