そろそろC++やります
そろそろC++をやります。そろそろC++をやりたいからです。
何回やるかはわかりません。基礎を理解するまではやろうと思います。
という感じでやっています。
※ 初心者がメモレベルで記録するので、技術記事としてはお力になれないかもしれません。
内容
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
を触ってみたいと思います。