日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式微處理器
[導(dǎo)讀]一、智能指針的學(xué)習(xí): 1、內(nèi)存泄漏: 關(guān)于內(nèi)存泄漏這個問題,一般都會牽扯到指針這個話題,也就是我們常說的動態(tài)內(nèi)存分配;然而在程序員手動進(jìn)行堆空間的分配時(指針無法控制所指堆空間的生命周期,),往往在寫完程序的時候,程序員一不小心就忘了釋放已經(jīng)手


一、智能指針的學(xué)習(xí):

1、內(nèi)存泄漏:

關(guān)于內(nèi)存泄漏這個問題,一般都會牽扯到指針這個話題,也就是我們常說的動態(tài)內(nèi)存分配;然而在程序員手動進(jìn)行堆空間的分配時(指針無法控制所指堆空間的生命周期,),往往在寫完程序的時候,程序員一不小心就忘了釋放已經(jīng)手動分配的內(nèi)存大小,導(dǎo)致軟件Bug不斷(也就是內(nèi)存泄漏)。

C++語言里面又沒有垃圾回收的機(jī)制(不像高級語言Java有自動的垃圾回收機(jī)制,),所以程序員在寫程序的時候,經(jīng)常會發(fā)生剛才上面說的那種情況,這里我們來看一個例子:

#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é)果:

txp@ubuntu:~$ ./a.out
0
1
2
3
4

注解:上面分配的堆空間,沒有釋放掉

2、我們需要什么?

  • 需要一個特殊的指針: 智能指針對象,通過類的普通構(gòu)造函數(shù)完成;

  • 指針生命周期結(jié)束的時候,主動釋放堆空間

  • 一片堆空間最多只能由一個指針標(biāo)識:避免多次釋放內(nèi)存,通過拷貝構(gòu)造函數(shù)和賦值操作符完成;

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

3、智能指針的使用:

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

  • 只能通過類的成員函數(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)// 1,智能指針對象,通過類的普通構(gòu)造函數(shù)完成;
    {
        mp = p;
    }
    Pointer(const Pointer& obj)//避免多次釋放內(nèi)存,通過拷貝構(gòu)造函數(shù)和賦值操作符完成;
    {
        mp = obj.mp;// 傳遞堆空間的控制;
        const_cast<Pointer&>(obj).mp = NULL;//初始化對象不管之前的;堆空間了,做所有權(quán)的轉(zhuǎn)移,保證堆空間最多只能由一個對象被標(biāo)識; 
    }
    Pointer& operator = (const Pointer& obj)
    {
        if( this != &obj )
        {
            delete mp;
            mp = obj.mp;
            const_cast<Pointer&>(obj).mp = NULL;
        }
        
        return *this;
    }
    Test* operator -> () // 返回指針,準(zhǔn)備指示;
    {
        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é)果:

txp@ubuntu:~$ ./a.out
Test(int i)
0
1
0
~Test()

總結(jié)提示:智能指針是一個類,這個類的構(gòu)造函數(shù)中傳入一個普通指針,析構(gòu)函數(shù)中釋放傳入的指針。智能指針的類都是棧上的對象,所以當(dāng)函數(shù)(或程序)結(jié)束時會自動被釋放

二、總結(jié):

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

  • 重載指針特征符能夠使用對象代替指針

  • 智能指針只能用指向堆空間中的內(nèi)存

  • 智能指針的意義在于最大程度的避免內(nèi)存問題

好了,今天的分享就到這里,如果文章中有錯誤或者不理解的地方,可以交流互動,一起進(jìn)步。我是txp,下期見!

免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

嵌入式ARM

掃描二維碼,關(guān)注更多精彩內(nèi)容

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉