溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++智能指針怎么使用

發(fā)布時間:2021-11-26 16:00:11 來源:億速云 閱讀:135 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“C++智能指針怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“C++智能指針怎么使用”吧!

1.什么是智能指針

C++智能指針是包含重載運算符的類,其行為像常規(guī)指針,但智能指針能夠及時妥善地銷毀動態(tài)分配的數(shù)據(jù),并實現(xiàn)了明確的對象生命周期,因此更有價值。
常規(guī)指針存在的問題
C++在內(nèi)存分配、釋放和管理方面提供了全面的靈活性;另一方面,它有可能產(chǎn)生與內(nèi)存相關(guān)的問題,比如動態(tài)分配的對象沒有正確地釋放將導(dǎo)致內(nèi)存泄漏。
智能指針的作用
智能指針的行為類似常規(guī)指針,但通過重載的運算符和析構(gòu)函數(shù)確保動態(tài)分配的數(shù)據(jù)能夠及時地銷毀,從而提供了更多有用的功能。
smart_pointer spDate = mObject.GetData ();
spData->Display();
(*spData).Display();

2.智能指針的實現(xiàn)

智能指針類重載了解除引用運算符(*)和成員選擇運算符(->),使得可以像常規(guī)指針那樣使用它們。下面演示一個簡單智能指針類的實現(xiàn):

template <typename T>class smart_pointer{
   
   
   private:
	T* m_pRawPointer;public:smart_pointer(T* pData) : m_pRawPointer(pData){
   
   
   }   //構(gòu)造函數(shù)~smart_pointer(){
   
   
   delete pData;}; //析構(gòu)函數(shù)smart_pointer(const smart_pointer & anotherSP); //復(fù)制構(gòu)造函數(shù)
	smart_pointer& operator= (const smart_pointer & anotherSP);
	T& operator*() const{
   
   
   return *(m_pRawPointer);}
	T* operator() const{
   
   
   return m_pRawPointer;}};

3.智能指針類型

智能指針決定在復(fù)制和賦值時如何處理內(nèi)存資源。智能指針的分類實際上就是內(nèi)存資源管理策略的分類。可分為以下幾類:
深復(fù)制、寫時復(fù)制、引用計數(shù)、引用鏈接、破壞性復(fù)制。
深復(fù)制
在實現(xiàn)深復(fù)制的智能指針中,每個智能指針實例都保存一個它管理的對象的完整副本。每當(dāng)智能指針被復(fù)制時,將復(fù)制它指向的對象。每當(dāng)智能指針離開作用域時,將釋放它指向的內(nèi)存。
雖然基于深復(fù)制的智能指針看起來并不比按值傳遞對象優(yōu)越,但在處理多態(tài)對象時,其優(yōu)點將顯示出來。
下面演示使用基于深復(fù)制的智能指針能將多態(tài)對象作為基類對象進行傳遞。

template<typename T>class deepcopy_smart_pointer{
   
   
   private:
	T* m_pObject;public:deepcopy_smart_pointer(const deepcopy_smart_pointer& source)  //復(fù)制構(gòu)造函數(shù){
   
   
   
		m_pObject = source->Clone();}
	deep_smart_pointer& operator=(const deepcopy_smart_pointer& source)  //復(fù)制賦值運算符{
   
   
   if(m_pObject)delete m_pObject;
		m_pObject=source->Clone();}};

4.使用std::unique_ptr

std::unique_ptr 是一種簡單的智能指針,但其復(fù)制構(gòu)造函數(shù)和賦值運算符被聲明為私有的,因此不能復(fù)制它,即不能將其按值傳遞給函數(shù),也不能將其賦值給其他指針。
unique_ptr是C++11新增的,與auto_ptr稍微不同,因為它不允許復(fù)制和賦值。使用std::unique_ptr,必須包含頭文件:

#include <memory>

下面將演示如何使用最簡單的智能指針:

#include <iostream>#include <memory>using namespace std;class Fish{
   
   
   public:Fish(){
   
   
   cout<<"構(gòu)造函數(shù)"<<endl;}~Fish(){
   
   
   cout<<"析構(gòu)函數(shù)"<<endl;}void Swim() const {
   
   
   cout<<"Fish swim in watar"<<endl;}};void MakeFishSwim(const unique_ptr<Fish>& inFish){
   
   
   
	inFish->Swim();}int main(){
   
   
   
	unique_ptr<Fish> smartFish(new Fish);
	smartFish->Swim();MakeFishSwim(smartFish);return 0;}

到此,相信大家對“C++智能指針怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI