欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++超詳細(xì)講解智能指針

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

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

  • 動(dòng)態(tài)申請(qǐng)堆空間,用完后不歸還
  • C++ 語(yǔ)言中沒(méi)有垃圾回收的機(jī)制
  • 指針無(wú)法控制所指堆空間的生命周期

下面看一段內(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é)果如下:

二、深度思考

  • 需要一個(gè)特殊的指針
  • 指針生命周期結(jié)束時(shí)主動(dòng)釋放堆空間
  • 一片堆空間最多只能由一個(gè)指針標(biāo)識(shí)
  • 杜絕指針運(yùn)算和指針比較

三、智能指針?lè)治?/h2>

解決方案

  • 重載指針特征操作符( -> 和 * )
  • 只能通過(guò)類(lèi)的成員函數(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é)果如下:

注意這兩行代碼的含義,

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ì)象。這就完成了前面說(shuō)的“一片堆空間最多只能由一個(gè)指針標(biāo)識(shí)”。

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

四、小結(jié)

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

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

相關(guān)文章

最新評(píng)論