最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++超詳細講解智能指針

 更新時間:2022年06月01日 08:55:34   作者:清風自在 流水潺潺  
為了解決內存泄漏的問題,C++中提出了智能指針。內存泄漏的產生原因有很多,即使我們正確的使用malloc和free關鍵字也有可能產生內存泄漏,如在malloc和free之間如果存在拋異常,那也會產生內存泄漏。這種問題被稱為異常安全

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

  • 動態(tài)申請堆空間,用完后不歸還
  • 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;
}

輸出結果如下:

二、深度思考

  • 需要一個特殊的指針
  • 指針生命周期結束時主動釋放堆空間
  • 一片堆空間最多只能由一個指針標識
  • 杜絕指針運算和指針比較

三、智能指針分析

解決方案

  • 重載指針特征操作符( -> 和 * )
  • 只能通過類的成員函數(shù)重載
  • 重載函數(shù)不能使用參數(shù)
  • 只能定義一個重載函數(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;
}

輸出結果如下:

注意這兩行代碼的含義,

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

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

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

四、小結

  • 指針特征操作符( -> 和 * )可以被重載
  • 重載指針特征符能夠使用對象代替指針
  • 智能指針只能用于指向堆空間中的內存
  • 智能指針的意義在于最大程度的避免內存問題

到此這篇關于C++超詳細講解智能指針的文章就介紹到這了,更多相關C++智能指針內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • matlab?GUI指紋識別門禁系統(tǒng)介紹及源碼實現(xiàn)

    matlab?GUI指紋識別門禁系統(tǒng)介紹及源碼實現(xiàn)

    這篇文章主要為大家介紹了matlab?GUI指紋識別門禁系統(tǒng)的介紹及源碼實現(xiàn),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步
    2022-02-02
  • C語言實現(xiàn)掃雷游戲詳解(附源碼)

    C語言實現(xiàn)掃雷游戲詳解(附源碼)

    大家好,本篇文章主要講的是C語言實現(xiàn)掃雷游戲詳解(附源碼),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-01-01
  • C語言實現(xiàn)通訊錄系統(tǒng)

    C語言實現(xiàn)通訊錄系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)通訊錄系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • C++印刷模板使用方法詳解

    C++印刷模板使用方法詳解

    模板是C++支持參數(shù)化多態(tài)的工具,使用模板可以使用戶為類或者函數(shù)聲明一種一般模式,使得類中的某些數(shù)據(jù)成員或者成員函數(shù)的參數(shù)、返回值取得任意類型
    2022-11-11
  • C語言實現(xiàn)簡單的五子棋小游戲

    C語言實現(xiàn)簡單的五子棋小游戲

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)簡單的五子棋小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 基于Matlab實現(xiàn)數(shù)字音頻分析處理系統(tǒng)

    基于Matlab實現(xiàn)數(shù)字音頻分析處理系統(tǒng)

    這篇文章主要為大家介紹了如何利用Matlab制作一個帶GUI的數(shù)字音頻分析與處理系統(tǒng)。文中的示例代碼講解詳細,感興趣的小伙伴可以學習一下
    2022-02-02
  • 關于STL中set容器的一些總結

    關于STL中set容器的一些總結

    關于set,必須說明的是set關聯(lián)式容器。set作為一個容器也是用來存儲同一數(shù)據(jù)類型的數(shù)據(jù)類型,并且能從一個數(shù)據(jù)集合中取出數(shù)據(jù),在set中每個元素的值都唯一,而且系統(tǒng)能根據(jù)元素的值自動進行排序
    2013-09-09
  • C++對象的動態(tài)建立與釋放詳解

    C++對象的動態(tài)建立與釋放詳解

    我們知道可以用new運算符可以動態(tài)的分配內存,用delete運算符可以釋放這些內存。當我們使用new運算符動態(tài)的分配一個內存之后,會自動返回一個該內存段的起始地址,也就是指針。
    2013-10-10
  • C++中的常對象與常對象成員詳解

    C++中的常對象與常對象成員詳解

    常成員函數(shù)可以訪問常對象中的數(shù)據(jù)成員,但仍然不允許修改常對象中數(shù)據(jù)成員的值。有時在編程時有要求,一定要修改常對象成員中的某個數(shù)據(jù)成員的值(例如類中有一個用于計數(shù)的變量count,其值應當不能變化)
    2013-10-10
  • EasyC++模板重載

    EasyC++模板重載

    這篇文章主要介紹了C++模板重載,重載的模板的函數(shù)特征,也就是入?yún)⒌臄?shù)量和類型必須有所不同,下面我們講舉例說明此內容,具有一定的參考價值,需要的小伙伴可以參考一下
    2021-12-12

最新評論

永清县| 乌兰察布市| 永和县| 渭南市| 新巴尔虎右旗| 射洪县| 合阳县| 云浮市| 奉节县| 洱源县| 临泽县| 新邵县| 巴彦县| 同心县| 柳江县| 广灵县| 贵州省| 蕲春县| 阿合奇县| 武强县| 翁源县| 壶关县| 江安县| 交城县| 康马县| 德化县| 固原市| 穆棱市| 罗江县| 姜堰市| 南郑县| 九台市| 应城市| 大理市| 丰宁| 富顺县| 台中市| 兴国县| 石阡县| 南投县| 云霄县|