C++RALLメカニズムの詳細

4145 ワード

  • RAIIはresource acquisition is initializationの略で、「リソース取得と初期化」を意味します.これはC++の親Bjarne Stroustrupが提案した設計理念であり、その核心はリソースとオブジェクトのライフサイクルをバインドし、オブジェクトを作成してリソースを取得し、オブジェクトを破棄してリソースを解放することである.RAIIの指導の下で、C++は下位レベルの資源管理問題を対象ライフサイクル管理のより高いレベルに昇格させた.
  • それではいったい何がRALLメカニズムですか?
  • C++を使用する場合、最も頭が痛いのはメモリ管理ですが、メモリの高さに対する操作性がC++プログラム猿に大きな自由と装填資本を与えています.
  • newがメモリ領域を出力すると、使用が完了した後、deleteを使用してこのリソースを解放しないとメモリが漏洩し、中大規模なプロジェクトでは破壊的になります.しかし、完璧な人はいません.私たちは毎回、再取得できないメモリを解放することを保証することはできません.次に、リソースを解放することを忘れてメモリが漏れるのがどんなに怖いかを例に挙げます.

  • #include   
    #include   
    
    int main()  
    {  
        for (int i = 1; i <= 10000000; i++)  
        {  
            int32_t *ptr = new int32_t[3];  
            ptr[0] = 1;  
            ptr[1] = 2;  
            ptr[2] = 3;  
            //delete ptr;     //           
        }  
        system("pause");  
        return 0;  
    }  

    プログラムを実行して、リソースマネージャを開けて、こんなに簡単なプログラムが500 MB以上のメモリを占有しているので、このような低級な間違いを犯さないように祈るべきです.3.資源の自動放出を保証する方法はありませんか?Javaのように、C++プログラム猿のメンツを失わない.
    このとき,オブジェクトの解析は自動的に完了すると考えられるが,このメカニズムを利用してもよいだろうか.答えははっきりしていますから、いいです.私たちがしなければならないのは、リソースをオブジェクトに管理することです.あるいは、このオブジェクトはリソースのエージェントであり、このオブジェクトが構築されたときにリソースの解放を完了します.そこで、上記の例を次のように変更することができます.
    #include   
    #include   
    
      //        ,        ,          ,       ;
    template<typename T>  
    class auto_release_ptr  
    {  
    public:  
        auto_release_ptr(T *t) :_t(t){};  
        ~auto_release_ptr()  
        {  
            delete _t;  
        };  
    
        T * getPtr()  
        {  
            return _t;  
        }  
    
    private:  
        T *_t;  
    };  
    
    int main()  
    {  
        for (int i = 1; i <= 10000000; i++)  
        {  
            auto arp = auto_release_ptr(new int32_t[3]);  
            int32_t *ptr = arp.getPtr();  
            ptr[0] = 1;  
            ptr[1] = 2;  
            ptr[2] = 3;  
        }  
        system("pause");  
        return 0;  
    }  

    メモリ消費量は0.5 Mのみ、メモリ消費量は0.5 Mのみ、メモリ消費量は0.5 Mになります.4.素晴らしいですね.newのたびにテンプレートクラスauto_に渡すだけです.release_ptrはメモリの漏洩を防ぐことができます!どうやって実現したのか見てみましょう.
    newを使用してメモリを出力すると、テンプレートクラスauto_に転送されます.release_ptrは,そのインスタンスのgetPtr()メソッドによりメモリアドレスを得た.auto_release_ptrには、構築時に初期化が完了し、newから出てきた空間を指すデータメンバーがいます.その解析関数ではdeleteを使用してメモリ空間を解放し、newから出てきたリソースとauto_があります.release_ptrオブジェクトと同じライフサイクルで、管理されるauto_release_ptrオブジェクトのライフサイクルが終了すると解放されます.ptrとauto_release_ptrオブジェクトの定義は1つであるため、それらのライフサイクルは自然に同じであり、ptrが回収された場合でも、その指向するメモリ空間が解放されないことを心配する必要はありません.
    もちろん、ここでは簡単に例を挙げてRALLを説明します.RALLメカニズムは,オブジェクトの自動破棄を利用することで,リソースにライフサイクルを持たせ,自動破棄(自動回収)の機能を持つ.