成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

智能指針類模板(五十)-創(chuàng)新互聯(lián)

    我們之前在 C++ 的學習中學習了有關智能指針的知識。那么智能指針的意義是現(xiàn)代 C++ 開發(fā)庫中最重要的類模板之一;是 C++ 中自動內存管理的主要手段,它能夠在很大程度上避開內存相關的問題。在 STL 標準庫中的智能指針為 auto_ptr,它的特點是:1、生命周期結束時,銷毀指向的內存空間;2、不能指向堆數(shù)組,只能指向堆對象(變量);3、一片堆空間只屬于一個智能指針對象;4、多個智能指針對象不能指向同一片堆空間。

“只有客戶發(fā)展了,才有我們的生存與發(fā)展!”這是創(chuàng)新互聯(lián)建站的服務宗旨!把網(wǎng)站當作互聯(lián)網(wǎng)產(chǎn)品,產(chǎn)品思維更注重全局思維、需求分析和迭代思維,在網(wǎng)站建設中就是為了建設一個不僅審美在線,而且實用性極高的網(wǎng)站。創(chuàng)新互聯(lián)對網(wǎng)站建設、做網(wǎng)站、網(wǎng)站制作、網(wǎng)站開發(fā)、網(wǎng)頁設計、網(wǎng)站優(yōu)化、網(wǎng)絡推廣、探索永無止境。

        下來我們就來使用下 auto_ptr 智能指針

#include <iostream>
#include <string>
#include <memory>

using namespace std;

class Test
{
    string m_name;
public:
    Test(const char* name)
    {
        cout << "Hello, " << name << "!" << endl;
        
        m_name = name;
    }
    
    void print()
    {
        cout << "I'm " << m_name << "!" << endl;
    }
    
    ~Test()
    {
        cout << "Goodbye, " << m_name << "!" << endl;
    }
};

int main()
{
   auto_ptr<Test> pt(new Test("D.T.Software"));
   
   cout << "pt = " << pt.get() << endl;
   
   pt->print();
   
   cout << endl;
   
   auto_ptr<Test> pt1(pt);
   
   cout << "pt = " << pt.get() << endl;
   cout << "pt1 = " << pt1.get() << endl;
   
   pt1->print();
    
    return 0;
}

        我們定義了一個類 Test 用來說明問題。在 main 函數(shù)中先是用 auto_ptr 指針來創(chuàng)建了一個指向 Test 類的指針,經(jīng)過下面這個指針 pt1 的操作后,pt 指針會指向空了。我們來看看編譯結果

智能指針類模板(五十)

        我們看到在經(jīng)過指針 pt1 指向 pt 操作之后,指針 pt 的值便為空了。而且我們也沒有 delete,它便會自動的去刪除指針,執(zhí)行了析構函數(shù)。下來我們再來說說 STL 標準庫中的其它智能指針:a> shared_ptr,帶有引用計數(shù)機制,支持多個指針對象指向同一片內存;b> weak_ptr,配合 shared_ptr 而引入的一種智能指針;c> unique_ptr,一個指針對象指向一片內存空間,不能拷貝構造和賦值。

        下來我們再來看看 QT 中的智能指針:a> QPointer,當其指向的對象被銷毀時,它會被自動置空,但是它析構時不會自動銷毀所指向的對象;b> QSharedPointer,引用計數(shù)型智能指針,可以被自由地拷貝和賦值,當引用計數(shù)為 0 時才刪除指向的對象。我們還是以 QT 中的代碼為例來進行分析(跟 C++ 差不多)

#include <QPointer>
#include <QSharedPointer>
#include <QDebug>

class Test : public QObject
{
    QString m_name;
public:
    Test(const char* name)
    {
        qDebug() << "Hello, " << name << "!";

        m_name = name;
    }

    void print()
    {
        qDebug() << "I'm " << m_name << "!";
    }

    ~Test()
    {
        qDebug() << "Goodbye, " << m_name << "!";
    }
};

int main()
{
    QPointer<Test> pt(new Test("D.T.Software"));
    QPointer<Test> pt1(pt);
    QPointer<Test> pt2(pt);

    pt->print();
    pt1->print();
    pt2->print();

    delete pt;

    qDebug() << endl;

    qDebug() << "pt = " << pt;
    qDebug() << "pt1 = " << pt1;
    qDebug() << "pt2 = " << pt2;

    QSharedPointer<Test> spt(new Test("David"));
    QSharedPointer<Test> spt1(spt);
    QSharedPointer<Test> spt2(spt);

    spt->print();
    spt1->print();
    spt2->print();

    return 0;
}

        在 QT 中的輸出是用 QDebug,它里面的字符串是用 QString 表示。我們在 QPointer 類中是手動調用 delete 的,而在 QSharedPointer 并沒有去調用 delete。來看看編譯結果智能指針類模板(五十)

        我們看到已經(jīng)實現(xiàn)了。在刪除了 QPointer 類后,它的三個指針都指向為空了。這便有效的防止了內存泄漏和野指針的操作了。那么我們介紹了這么多的智能指針后,我們再基于我們之前創(chuàng)建的智能指針,在它的基礎上自己再來實現(xiàn)一個智能指針類模板。

SmartPointer.h 源碼

#ifndef _SMARTPOINTER_H_
#define _SMARTPOINTER_H_

template
< typename T >
class SmartPointer
{
    T* mp;
public:
    SmartPointer(T* p = NULL)
    {
        mp = p;
    }
    
    SmartPointer(const SmartPointer<T>& obj)
    {
        mp = obj.mp;
        const_cast<SmartPointer<T>&>(obj).mp = NULL;
    }
    
    SmartPointer<T>& operator = (const SmartPointer<T>& obj)
    {
        if( this != &obj )
        {
            delete mp;
            mp = obj.mp;
            const_cast<SmartPointer<T>&>(obj).mp = NULL;
        }
        
        return *this;
    }
    
    T* operator -> ()
    {
        return mp;
    }
    
    T& operator * ()
    {
        return *mp;
    }
    
    bool isNull()
    {
        return (mp == NULL);
    }
    
    T* get()
    {
        return mp;
    }
    
    ~SmartPointer()
    {
        delete mp;
    }
};

#endif

test.cpp 源碼

#include <iostream>
#include <string>
#include "SmartPointer.h"

using namespace std;

class Test
{
    string m_name;
public:
    Test(const char* name)
    {
        cout << "Hello, " << name << "!" << endl;
        
        m_name = name;
    }
    
    void print()
    {
        cout << "I'm " << m_name << "!" << endl;
    }
    
    ~Test()
    {
        cout << "Goodbye, " << m_name << "!" << endl;
    }
};

int main()
{
    SmartPointer<Test> pt(new Test("D.T.Software"));

    cout << "pt = " << pt.get() << endl;

    pt->print();

    cout << endl;

    SmartPointer<Test> pt1(pt);

    cout << "pt = " << pt.get() << endl;
    cout << "pt1 = " << pt1.get() << endl;

    pt1->print();

    return 0;
}

        我們在 main 函數(shù)沒有改動,只是將 auto_ptr 指針改為我們自己實現(xiàn)的 SmartPointer 了,再來看看是不是和之前的效果是一樣的呢?

智能指針類模板(五十)

        通過對智能指針類模板的學習,總結如下:1、智能指針是 C++ 中自動內存管理的主要手段;2、智能指針在各種平臺上都有不同的表現(xiàn)形式;3、智能指針能夠盡可能的避開內存相關的問題;4、STL 和 Qt 中都提供了對智能指針的支持。

        歡迎大家一起來學習 C++ 語言,可以加我QQ:243343083。

另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。

網(wǎng)站名稱:智能指針類模板(五十)-創(chuàng)新互聯(lián)
文章URL:http://jinyejixie.com/article6/djepog.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、定制網(wǎng)站全網(wǎng)營銷推廣、定制開發(fā)、網(wǎng)站收錄網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
临颍县| 响水县| 象山县| 呼玛县| 霍州市| 井冈山市| 开平市| 阳曲县| 镇赉县| 罗江县| 张掖市| 尼勒克县| 石嘴山市| 永善县| 田阳县| 应城市| 蒙城县| 库伦旗| 青川县| 潜山县| 武威市| 灌云县| 潼关县| 辉南县| 象州县| 苏尼特左旗| 邢台县| 河曲县| 莱芜市| 共和县| 乐东| 霍州市| 太仆寺旗| 紫金县| 洪湖市| 甘孜县| 基隆市| 镇雄县| 玛多县| 浦县| 襄城县|