shared_ptrをOUTパラメータで使用する

C++ の shared_ptr を引数の OUTパラメータに指定する方法の紹介です。

方法は非常に簡単です。引数を参照渡しすることで実現できます。

// 引数を参照にすることでOUTパラメータとして受け取れる
void create(shared_ptr<Any>& out_value);

これを呼び出し側で以下のように指定します。メソッドを抜けた時点で変数 out_value に Foo() のインスタンスが share_ptr に設定されている状態で取得できます。

// 使用方法
shared_ptr<Foo> out_value(nullptr);
create(out_value);

内容が nullptr の shared_ptr を作成して、関数内でインスタンスを設定したものを受け取るという形になります。

確認環境

以下、動作確認環境は以下の通りです。

  • Windows10
  • VisualStudio2017
  • VC++ (WindowsSDK 10.0.17763.0)

コード例

先述のコードの正当性を確認します。先ずは、以下のクラス(Foo)を宣言します。クラスはコンストラクタとデストラクタでメッセージを出力する機能を持ちます。

class Foo
{
    int no = 0;
public:

    Foo(int no)
    {
        cout << "コンストラクター" << no << endl;
        this->no = no;
    }

    ~Foo() { cout << "デストラクター" << no << endl; }
};

次に以下関数を実装し実行します。対応する出力内容を合わせて記載します。

#include <iostream>
#include <memory>

using namespace std;

void createFoo(std::shared_ptr<Foo>& value)
{
    //value = std::shared_ptr<Foo>(new Foo());
    value = std::make_shared<Foo>(1);
}

int main()
{
    cout << "開始" << endl;

    {                                 // 【出力内容】
        auto p = make_shared<Foo>(0); // > コンストラクター0
        // shared_ptr<Foo> p(nullptr);
        createFoo(p);                 // > コンストラクター1
                                      // > デストラクター0

        p = make_shared<Foo>(2);      // > コンストラクター2
                                      // > デストラクター1

    }                                 // > デストラクター2

    cout << "終了" << endl;
}