スマートポインタの例

スマートポインタクラステンプレートは、技術の実装を通じて、実際にあります

メモリリーク(悪名高いバグ) -簡単にソフトウェアの開発とテストで発見されていない
- 動的アプリケーション・ヒープ、排出は戻りませ
-C ++言語は、ガベージコレクションのためのメカニズムではありません
- ポインタは、ヒープの意味の範囲内に制御することができませんライフサイクル・スペース

近代C ++ソフトウェアプラットフォームのスマートポインタ
- ライフサイクルの終わりに、ヒープポインタを解放するためのイニシアチブをとる
- アップポインタの識別の唯一のヒープ

- ポインタとポインタ算術比較をなくします

スマートポインタデザイン
- クラステンプレートでは、ポインタの動作を説明し
  定義することができ、異なるタイプのポインタ・オブジェクトの
- 過負荷特性オペレータポインタ( - >および*)ネイティブポインターの挙動をシミュレートオブジェクトを使用して
  

SmartPointer.h

 

#ifndefのSMARTPOINTER_H_
 の#define SMARTPOINTER_H_ 名前空間DTLib 
{ 
テンプレート <型名T>
 クラスSmartPointer 
{ 保護
    T * m_pointer。
公共
    SmartPointer(T * P = NULL)
    { 
        m_pointer = P。
    } 
    T * 演算子 - > ()
    { 戻りm_pointer。
    } 
    T演算子 * ()
    { リターン *




        

        m_pointer; 
    } 

    SmartPointer(CONST SmartPointer <T>&OBJ)
    { 
        m_pointer = obj.m_pointer。
        const_cast <SmartPointer <T>&>(OBJ).m_pointer = NULL; 
    } 

    SmartPointer <T>&演算子 =(CONST SmartPointer <T>&OBJ)
    { 
        場合この =&!OBJ)
        { 
            削除m_pointer。
            m_pointer = obj.m_pointer。
            const_cast <SmartPointer <T>&>(OBJ)。

        戻り * この ;    //は、連続割り当てをサポートすることができる
    } 

    T * GET ()
    { 
        戻りm_pointer; 
    } 

    BOOL のisNull()
    { 
        リターン(m_pointer == NULL); 
    }

    SmartPointer()
    { 
        削除m_pointer; 
    } 

}; 

} 

#endifの / / SMARTPOINTER_H_

 

main.cppに

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

using namespace std;
using namespace DTLib;

class Test
{
public:
    Test()
    {
        cout << "Test()" << endl;
    }
    ~Test()
    {
        cout << "~Test()" << endl;
    }


};

int main()
{

    SmartPointer<Test> sp = new Test();
    SmartPointer<Test> nsp;

    nsp = sp;
    cout << sp.isNull() << endl;
    cout << nsp.isNull() << endl;

    cout << "sp = " << sp.get() << endl;
    cout << "nsp = " << nsp.get() << endl;


    return 0;
}

智能指针的使用军规
只能用来指向堆空间中的单个对象或者变量
不能指向堆空间中的一个数组,也不能用来指向一个局部的对象或局部的变量

 

 

 

おすすめ

転載: www.cnblogs.com/-glb/p/12032012.html