溫馨提示×

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

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

C++智能指針實(shí)例代碼分析

發(fā)布時(shí)間:2022-06-01 11:02:35 來源:億速云 閱讀:122 作者:zzz 欄目:開發(fā)技術(shù)

這篇文章主要講解了“C++智能指針實(shí)例代碼分析”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++智能指針實(shí)例代碼分析”吧!

一、內(nèi)存泄漏-永恒的話題

  • 動(dòng)態(tài)申請(qǐng)堆空間,用完后不歸還

  • C++ 語言中沒有垃圾回收的機(jī)制

  • 指針無法控制所指堆空間的生命周期

下面看一段內(nèi)存泄漏的代碼:

#include <iostream>
#include <string>
using namespace std;
class Test
{
    int i;
public:
    Test(int i)
    {
        this->i = i;
    }
    int value()
    {
        return i;
    }
    ~Test()
    {
    }
};
int main()
{
    for(int i=0; i<5; i++)
    {
        Test* p = new Test(i);        
        cout << p->value() << endl;      
    }    
    return 0;
}

輸出結(jié)果如下:

C++智能指針實(shí)例代碼分析

二、深度思考

  • 需要一個(gè)特殊的指針

  • 指針生命周期結(jié)束時(shí)主動(dòng)釋放堆空間

  • 一片堆空間最多只能由一個(gè)指針標(biāo)識(shí)

  • 杜絕指針運(yùn)算和指針比較

三、智能指針分析

解決方案

  • 重載指針特征操作符( -> 和 * )

  • 只能通過類的成員函數(shù)重載

  • 重載函數(shù)不能使用參數(shù)

  • 只能定義一個(gè)重載函數(shù)

下面看一段智能指針的使用示例:

#include <iostream>
#include <string>
using namespace std;
class Test
{
    int i;
public:
    Test(int i)
    {
        cout << "Test(int i)" << endl;
        this->i = i;
    }
    int value()
    {
        return i;
    }
    ~Test()
    {
        cout << "~Test()" << endl;
    }
};
class Pointer
{
    Test* mp;
public:
    Pointer(Test* p = NULL)
    {
        mp = p;
    }
    Pointer(const Pointer& obj)
    {
        mp = obj.mp;
        const_cast<Pointer&>(obj).mp = NULL;
    }
    Pointer& operator = (const Pointer& obj)
    {
        if (this != &obj)
        {
            delete mp;
            mp = obj.mp;
            const_cast<Pointer&>(obj).mp = NULL;
        }
        return *this;
    }
    Test* operator -> ()
    {
        return mp;
    }
    Test& operator * ()
    {
        return *mp;
    }
    bool isNull()
    {
        return (mp == NULL);
    }
    ~Pointer()
    {
        delete mp;
    }
};
int main()
{
    Pointer p1 = new Test(0);
    cout << p1->value() << endl;
    Pointer p2 = p1;
    cout << p1.isNull() << endl;
    cout << p2->value() << endl;
    return 0;
}

輸出結(jié)果如下:

C++智能指針實(shí)例代碼分析

注意這兩行代碼的含義,

mp = obj.mp;
const_cast<Pointer&>(obj).mp = NULL;

表明當(dāng)前對(duì)象的成員指針指向初始化對(duì)象的成員指針?biāo)鶎?duì)應(yīng)的堆空間,這就兩個(gè)智能指針對(duì)象指向了同一片堆空間,然后 const_cast<Pointer&>(obj).mp = NULL; 表明初始化對(duì)象把自己管理的堆空間交給當(dāng)前對(duì)象。這就完成了前面說的“一片堆空間最多只能由一個(gè)指針標(biāo)識(shí)”。

智能指針使用的軍規(guī):只能用來指向堆空間中的對(duì)象或者變量

感謝各位的閱讀,以上就是“C++智能指針實(shí)例代碼分析”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C++智能指針實(shí)例代碼分析這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

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

c++
AI