中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

C++智能指針實例代碼分析

發布時間:2022-06-01 11:02:35 來源:億速云 閱讀:130 作者:zzz 欄目:開發技術

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

一、內存泄漏-永恒的話題

  • 動態申請堆空間,用完后不歸還

  • C++ 語言中沒有垃圾回收的機制

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

下面看一段內存泄漏的代碼:

#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;
}

輸出結果如下:

C++智能指針實例代碼分析

二、深度思考

  • 需要一個特殊的指針

  • 指針生命周期結束時主動釋放堆空間

  • 一片堆空間最多只能由一個指針標識

  • 杜絕指針運算和指針比較

三、智能指針分析

解決方案

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

  • 只能通過類的成員函數重載

  • 重載函數不能使用參數

  • 只能定義一個重載函數

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

#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;
}

輸出結果如下:

C++智能指針實例代碼分析

注意這兩行代碼的含義,

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

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

智能指針使用的軍規:只能用來指向堆空間中的對象或者變量

感謝各位的閱讀,以上就是“C++智能指針實例代碼分析”的內容了,經過本文的學習后,相信大家對C++智能指針實例代碼分析這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

武汉市| 平塘县| 昌邑市| 明光市| 汝城县| 崇州市| 乐业县| 兰西县| 山阳县| 松溪县| 道真| 鹿邑县| 锦州市| 三亚市| 启东市| 平乐县| 张北县| 邻水| 广安市| 新乐市| 新巴尔虎右旗| 若尔盖县| 五大连池市| 宣威市| 大冶市| 泗水县| 安徽省| 长子县| 千阳县| 渝北区| 虎林市| 武安市| 北海市| 青冈县| 弥渡县| 芦山县| 上蔡县| 安泽县| 大冶市| 台中市| 南靖县|