スマートポインタクラステンプレートは、技術の実装を通じて、実際にあります
メモリリーク(悪名高いバグ) -簡単にソフトウェアの開発とテストで発見されていない
- 動的アプリケーション・ヒープ、排出は戻りませ
-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;
}
智能指针的使用军规
只能用来指向堆空间中的单个对象或者变量
不能指向堆空间中的一个数组,也不能用来指向一个局部的对象或局部的变量