C++におけるスマートポインタの学習

2747 ワード

開始前に、テスト用の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インスタンスの作成と使用方法