大雨のち大晴れ

C++とかUE4とかの記事を書くかもしれないブログ

スマートポインタを使ってみる - std::shared_ptr -

前置き

 スマポの存在や便利さは知ってるものの、結局生ポを使用してしまう今日この頃です。
そんな中先日、生ポで痛い目にあったのでこれを機に使い方を勉強しようと思います。

スマートポインタとは

動的確保したメモリを自動的に解放してくれるすごいヤツです。

std::shared_ptrとは

C++11で 追加されたスマポです。
リソースの所有権を共有し、所有者がいなくなると自動的にリソースの解放を行います。

内部に参照カウンタを持ち所有者が増えるとカウントアップし、所有者が消えるとカウントダウンします。
このカウントが0になった時点でリソースが解放されます。

使用例

所有者の増加と解放のタイミングを確認してみます。

#include <iostream>
#include <memory>

class Hoge
{
public:
    Hoge()
    {
        std::cout << "メモリが確保されました。" << std::endl;
    }

    ~Hoge()
    {
	std::cout << "メモリが解放されました。" << std::endl;
    }
};

int main()
{
    // 1人目の所有者
    std::shared_ptr<Hoge> p1(new Hoge());

    // 所有者数を確認
    std::cout << "現在の所有者数 : " << p1.use_count() << std::endl;
    
    {
        // 2人目の所有者
        auto p2 = p1;

        // 所有者数を確認
	std::cout << "現在の所有者数 : " << p2.use_count() << std::endl;
    } // ここでp2が削除され、所有者が一人減る
	
    // 所有者数を確認
    std::cout << "現在の所有者数 : " << p1.use_count() << std::endl;
	
    return 0;
}

出力はこんな感じです。

メモリが確保されました。
現在の所有者数 : 1
現在の所有者数 : 2
現在の所有者数 : 1
メモリが解放されました。

無事、メモリが解放されることが確認出来ました。

最後に

これでメモリリークに怯える日々から解放されます!
いざ快適なC++ライフへ …