91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

栖霞市| 海城市| 灵川县| 仙居县| 马鞍山市| 县级市| 邳州市| 宝丰县| 定州市| 右玉县| 辽宁省| 涞源县| 尼玛县| 天门市| 武清区| 响水县| 贵定县| 周至县| 汶上县| 沅江市| 长沙县| 师宗县| 康乐县| 会宁县| 博湖县| 东乡族自治县| 太原市| 平湖市| 葫芦岛市| 哈尔滨市| 沧源| 盐源县| 丹阳市| 靖州| 泸溪县| 溧水县| 眉山市| 韶关市| 贡山| 金沙县| 孝义市|