您好,登錄后才能下訂單哦!
本篇內容主要講解“C++智能指針怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“C++智能指針怎么使用”吧!
C++智能指針是包含重載運算符的類,其行為像常規指針,但智能指針能夠及時妥善地銷毀動態分配的數據,并實現了明確的對象生命周期,因此更有價值。
常規指針存在的問題
C++在內存分配、釋放和管理方面提供了全面的靈活性;另一方面,它有可能產生與內存相關的問題,比如動態分配的對象沒有正確地釋放將導致內存泄漏。
智能指針的作用
智能指針的行為類似常規指針,但通過重載的運算符和析構函數確保動態分配的數據能夠及時地銷毀,從而提供了更多有用的功能。
smart_pointer spDate = mObject.GetData ();
spData->Display();
(*spData).Display();
智能指針類重載了解除引用運算符(*)和成員選擇運算符(->),使得可以像常規指針那樣使用它們。下面演示一個簡單智能指針類的實現:
template <typename T>class smart_pointer{ private: T* m_pRawPointer;public:smart_pointer(T* pData) : m_pRawPointer(pData){ } //構造函數~smart_pointer(){ delete pData;}; //析構函數smart_pointer(const smart_pointer & anotherSP); //復制構造函數 smart_pointer& operator= (const smart_pointer & anotherSP); T& operator*() const{ return *(m_pRawPointer);} T* operator() const{ return m_pRawPointer;}};
智能指針決定在復制和賦值時如何處理內存資源。智能指針的分類實際上就是內存資源管理策略的分類。可分為以下幾類:
深復制、寫時復制、引用計數、引用鏈接、破壞性復制。
深復制
在實現深復制的智能指針中,每個智能指針實例都保存一個它管理的對象的完整副本。每當智能指針被復制時,將復制它指向的對象。每當智能指針離開作用域時,將釋放它指向的內存。
雖然基于深復制的智能指針看起來并不比按值傳遞對象優越,但在處理多態對象時,其優點將顯示出來。
下面演示使用基于深復制的智能指針能將多態對象作為基類對象進行傳遞。
template<typename T>class deepcopy_smart_pointer{ private: T* m_pObject;public:deepcopy_smart_pointer(const deepcopy_smart_pointer& source) //復制構造函數{ m_pObject = source->Clone();} deep_smart_pointer& operator=(const deepcopy_smart_pointer& source) //復制賦值運算符{ if(m_pObject)delete m_pObject; m_pObject=source->Clone();}};
std::unique_ptr 是一種簡單的智能指針,但其復制構造函數和賦值運算符被聲明為私有的,因此不能復制它,即不能將其按值傳遞給函數,也不能將其賦值給其他指針。
unique_ptr是C++11新增的,與auto_ptr稍微不同,因為它不允許復制和賦值。使用std::unique_ptr,必須包含頭文件:
#include <memory>
下面將演示如何使用最簡單的智能指針:
#include <iostream>#include <memory>using namespace std;class Fish{ public:Fish(){ cout<<"構造函數"<<endl;}~Fish(){ cout<<"析構函數"<<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++智能指針怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。