【データ構造】9_スマートポインタ例
2958 ワード
メモリリーク(悪名高いBug)ダイナミックメモリはスタックスペースを申請し、使い終わったら を返さない. C++言語にごみ回収のメカニズムがない ポインタは、指すスタック空間のライフサイクル を制御できません.
現代のC++ソフトウェアプラットフォームにおけるスマートポインタポインタライフサイクル終了時アクティブ解放スタック空間 スタックスペースは、最大 のポインタのみで識別できます.根絶ポインタ演算とポインタ比較 インテリジェントポインタの設計案クラステンプレートを介してポインタの動作を記述する は、異なる種類のポインタオブジェクト を定義することができる.
リロードポインタフィーチャーオペレータ オブジェクトを利用して原生ポインタの挙動 をシミュレートする.
プログラミング実験:スマートポインタ
ファイル:SmartPointer.h
ファイル:main.cpp
出力:
スマートポインタの使用軍規
小結ポインタフィーチャーオペレータ(->および*)は、 をリロードすることができる.リロードポインタフィーチャーは、ポインタ の代わりにオブジェクトを使用する. スマートポインタの意味は、メモリの問題を最小限に抑えることです.
以上の内容はディテソフトウェア学院シリーズの課程に整理されています.オリジナルを守ってください.
現代の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()
スマートポインタの使用軍規
の
オブジェクトまたは変数のみを指すために使用できます.小結
以上の内容はディテソフトウェア学院シリーズの課程に整理されています.オリジナルを守ってください.