C++におけるスマートポインタの学習
2747 ワード
開始前に、テスト用の
unique_ptr
unique_ptrは、同じスタックメモリが1つのunique_によってのみ許可されるptr保有.コード上はこう見えます.
shared_ptr
このタイプのスマートポインタを使ったスタイルは、Javaによく似ています.
実行後のメモリにはこのようなものがあるはずです.
shared_ptrは、参照カウントによって実現される.すなわち、ループ参照は解決されない.
実験は以下の通りです:まず1つの方法を書いて、中は2つのshared_を構築しましたptr、MyObjectオブジェクトにshared_があるからptrメンバー変数なので、この2つのオブジェクトを相互参照します.
次に、このメソッドをメイン関数に配置して実行し、エンドポイントで実行し、各ステップのメモリの変化を表示します.
メモリには次のように表示されます.
weak_ptr
ループリファレンスの問題を解決するにはweak_を使用します.ptrがやる.
次に、上記のコードとほぼ同じコードを再使用してテストします.
まとめ
ここでは初歩的な、「用法」に関する学習探究過程の記録にすぎない.まだ実戦には投入されていないので、特別な心得やテクニックを共有することはありません.
リファレンス
インテリジェントポインタ(現代C++)の作成とunique_ptrインスタンスの使用方法:shared_ptrインスタンスの作成と使用方法:共有weak_ptrインスタンスの作成と使用方法
MyObject
クラスを定義します.class MyObject
{
private:
int m_Value = 0;
int m_Data[10240]; //
std::shared_ptr m_Child;
public:
MyObject(const int value)
{
m_Value = value;
}
int GetValue()
{
return m_Value;
}
void SetChild(std::shared_ptr& child)
{
m_Child = child;
}
};
unique_ptr
unique_ptrは、同じスタックメモリが1つのunique_によってのみ許可されるptr保有.コード上はこう見えます.
std::unique_ptr up_obj(new MyObject(100));
//std::unique_ptr up_obj2(up_obj); // C2280
//std::unique_ptr up_obj3;
//up_obj3 = up_obj; // C2280
std::shared_ptr sp_obj(new MyObject(200));
// unique_ptr
//std::shared_ptr sp_o = up_obj; // C2440
//std::unique_ptr up_fuck = sp_obj; // C2440
// ,
std::shared_ptr sppp(up_obj.get());
shared_ptr
このタイプのスマートポインタを使ったスタイルは、Javaによく似ています.
std::shared_ptr sp_obj(new MyObject(123));
std::shared_ptr sp_obj2(sp_obj);
std::shared_ptr sp_obj3 = sp_obj;
std::cout << "sp_obj value: " << sp_obj->GetValue() << " use count: " << sp_obj.use_count() << std::endl;
実行後のメモリにはこのようなものがあるはずです.
shared_ptrは、参照カウントによって実現される.すなわち、ループ参照は解決されない.
実験は以下の通りです:まず1つの方法を書いて、中は2つのshared_を構築しましたptr、MyObjectオブジェクトにshared_があるからptrメンバー変数なので、この2つのオブジェクトを相互参照します.
void testLoopRef()
{
std::shared_ptr sp_obj111(new MyObject(111));
std::shared_ptr sp_obj999(new MyObject(999));
sp_obj111->SetChild(sp_obj999);
sp_obj999->SetChild(sp_obj111);
}
次に、このメソッドをメイン関数に配置して実行し、エンドポイントで実行し、各ステップのメモリの変化を表示します.
メモリには次のように表示されます.
weak_ptr
ループリファレンスの問題を解決するにはweak_を使用します.ptrがやる.
MyObject
種類を改造してm_Child属性をweak_に変更ptrの.class MyObject2
{
private:
int m_Value = 0;
int m_Data[10240];
std::weak_ptr m_Child;
public:
MyObject2(const int value)
{
m_Value = value;
}
int GetValue()
{
return m_Value;
}
void SetChild(std::shared_ptr& child)
{
m_Child = child;
}
};
次に、上記のコードとほぼ同じコードを再使用してテストします.
まとめ
ここでは初歩的な、「用法」に関する学習探究過程の記録にすぎない.まだ実戦には投入されていないので、特別な心得やテクニックを共有することはありません.
リファレンス
インテリジェントポインタ(現代C++)の作成とunique_ptrインスタンスの使用方法:shared_ptrインスタンスの作成と使用方法:共有weak_ptrインスタンスの作成と使用方法