topazの遊び場

いろいろやってみる

そろそろC++やるぞパート17 ポインター ~ スマートポインタ/shared_ptr ~

そろそろC++やります

そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。

という感じでやっています。

※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。

内容

  • 今回は、Microsoftドキュメントと他の記事を参考にして、スマートポインタの一つshared_ptrについて行います。

shared_ptrの宣言

make_shared< > ヘルパー関数を使用して、shared_ptrの宣言ができます。

shared_ptr<{型}> {変数名} = make_shared<{型}>(<{初期値}>);

int型やstring型の場合はこのように書くことができます。

shared_ptr<int> sp = make_shared<int>(10);
shared_ptr<int> sp = make_shared<int>();
shared_ptr<string> sp2 = make_shared<string>("Hello World!");

また、調べた限りでは、shared_ptrの宣言位は型推論auto)を用いているところが多いようです。

auto sp = make_shared<int>(124);
auto sp2 = make_shared<string>("Hello World!");

初回化は、このような初期化方法もあります。

shared_ptr<int> sp3(new int(246));

ただしこれは、公式のところに少し効率が悪いと書いてあります。

// Ok, but slightly less efficient.
// Note: Using new expression as constructor argument
// creates no named variable for other code to access.

そのため、これからmake_sharedを使うことにします。

shared_ptrとは

前回unique_ptrとの違いとして、所有権を複数に共有することができます

unique_ptrの場合
宣言した変数を他の変数に代入することができませんでした。

auto up = make_unique<int>(235);
auto up2 = up;  // コンパイルエラー

shared_ptrの場合
宣言した変数を他の変数に代入することができます。

auto sp = make_shared<int>(145);
auto sp2 = sp;  // コンパイル/実行可能

仕組み

shared_ptrは複数の所有権を持つ変数を作ることができるため、所有権を持つ変数を数える参照カウントが存在します。コピーした時に、参照カウントがインクリメントされ、ブロックを外れたり、明示的解放が行われた時に、デクリメントされます。この参照カウントが0になった時に、メモリの解放が行われます。

参考リスト

感想

今回はshared_ptrについて触れて行きましたが、これが一番変数と同じように使用できるスマートポインタという感じでした。ただ、循環参照という、テーマが一つ残っているのですが、これは次回内容もカラムので次回に行います。

次回は、次のweak_ptrを触ってみたいと思います。