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

溫馨提示×

溫馨提示×

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

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

c++智能指針怎么用

發布時間:2022-01-12 22:06:56 來源:億速云 閱讀:157 作者:iii 欄目:編程語言

這篇文章主要介紹“c++智能指針怎么用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“c++智能指針怎么用”文章能幫助大家解決問題。

        我們在程序開發中,難免會遇到內存泄漏。那么什么是內存泄漏呢?就是動態申請堆空間,用完后不歸還。在 C++ 語言中沒有垃圾回收機制,在后續的語言如 Java、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;
    }
};

int main()
{
    for(int i=0; i<5; i++)
    {
        Test* p = new Test(i);
        
        cout << p->value() << endl;
    }
    
    return 0;
}

        我們明顯看到在 main 函數中只 new 對象了,而沒有 delete 對象。我們看看運行結果

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(5);
    
    cout << p1->value() << endl;
    
    Pointer p2 = p1;
    
    cout << p1.isNull() << endl;
    
    cout << p2->value() << endl;
    
    return 0;
}

        我們在程序中定義了一個 Pointer 類,進行了一系列的操作符重載。打印 p1 的值就肯定為 5,接著將 p1 賦值給 p2,那么此時 p1 就應該為空了,因為一片空間只能有一個標識符。所以在第 78 行打印出的肯定是 1 了,最后打印的 p2 的值也就為 5 了。我們看看編譯結果

c++智能指針怎么用

關于“c++智能指針怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

c++
AI

上高县| 鲜城| 保山市| 桐庐县| 南阳市| 林周县| 平利县| 岳阳县| 巢湖市| 图木舒克市| 神木县| 德江县| 武城县| 兴化市| 盈江县| 凌源市| 河北省| 临江市| 文登市| 拉孜县| 旅游| 芜湖县| 思茅市| 江城| 介休市| 鄂托克前旗| 昭平县| 荣昌县| 楚雄市| 南溪县| 泸西县| 巴楚县| 武山县| 八宿县| 梓潼县| 漳浦县| 呼和浩特市| 手游| 喀什市| 峨眉山市| 苏尼特左旗|