【データ構造】9_スマートポインタ例

2958 ワード

メモリリーク(悪名高いBug)
  • ダイナミックメモリはスタックスペースを申請し、使い終わったら
  • を返さない.
  • C++言語にごみ回収のメカニズムがない
  • ポインタは、指すスタック空間のライフサイクル
  • を制御できません.
    現代のC++ソフトウェアプラットフォームにおけるスマートポインタ
  • ポインタライフサイクル終了時アクティブ解放スタック空間
  • スタックスペースは、最大
  • のポインタのみで識別できます.
  • 根絶ポインタ演算とポインタ比較
  • インテリジェントポインタの設計案
  • クラステンプレートを介してポインタの動作を記述する
  • は、異なる種類のポインタオブジェクト
  • を定義することができる.
  • リロードポインタフィーチャーオペレータ(-> *)
  • オブジェクトを利用して原生ポインタの挙動
  • をシミュレートする.

    プログラミング実験:スマートポインタ
    ファイル:SmartPointer.h
    #ifndef SMARTPOINTER_H
    #define SMARTPOINTER_H
    
    namespace DTLib
    {
    template
    class SmartPointer
    {
    public:
        SmartPointer(T *p = nullptr)
        {
            m_pointer = p;
        }
    
        SmartPointer(const SmartPointer &obj)
        {
            m_pointer = obj.m_pointer;
            const_cast(obj).m_pointer = nullptr;
        }
    
        SmartPointer &operator = (const SmartPointer &obj)
        {
            if (this != &obj)
            {
                delete m_pointer;
                m_pointer = obj.m_pointer;
                const_cast(obj).m_pointer = nullptr;
            }
    
            return *this;
        }
    
        T *operator -> ()
        {
            return m_pointer;
        }
    
        T &operator * ()
        {
            return *m_pointer;
        }
    
        bool isNull()
        {
            return (m_pointer == nullptr);
        }
    
        T *get()
        {
            return m_pointer;
        }
    
        ~SmartPointer()
        {
            delete m_pointer;
        }
    
    private:
        T *m_pointer = nullptr;
    };
    }
    
    #endif // SMARTPOINTER_H

    ファイル:main.cpp
    #include 
    #include "SmartPointer.h"
    
    using namespace std;
    using namespace DTLib;
    
    class Test
    {
    public:
        Test()
        {
            cout << "Test()" << endl;
        }
    
        ~Test()
        {
            cout << "~Test()" << endl;
        }
    
        void print()
        {
            cout << "void print() : " << value << endl;
        }
    
    private:
        int value = 10;
    };
    
    int main()
    {
        SmartPointer p1 = new Test();
        SmartPointer p2(p1);
        cout << "p1 = " << p1.isNull() << endl;
        cout << "p2 = " << p2.isNull() << endl;
    
        SmartPointer p3;
        p3 = p2;
        cout << "p2 = " << p2.isNull() << endl;
        cout << "p3 = " << p3.isNull() << endl;
    
        p3->print();
        (*p3).print();
    
        return 0;
    }

    出力:
    Test()
    p1 = 1
    p2 = 0
    p2 = 1
    p3 = 0
    void print() : 10
    void print() : 10
    ~Test()

    スマートポインタの使用軍規 オブジェクトまたは変数のみを指すために使用できます.
    小結
  • ポインタフィーチャーオペレータ(->および*)は、
  • をリロードすることができる.
  • リロードポインタフィーチャーは、ポインタ
  • の代わりにオブジェクトを使用する.
  • スマートポインタの意味は、メモリの問題を最小限に抑えることです.
    以上の内容はディテソフトウェア学院シリーズの課程に整理されています.オリジナルを守ってください.