shared_ptrとかmake_sharedとかweak_ptrについてのメモ

  • std::shared_ptrはC++11で導入された
  • g++だと -std=c++11 を付ける
  • shared_ptrの初期化用にmake_sharedがある。

使わない場合


auto p = std::shared_ptr(new T())

使う場合


auto p = std::make_shared();

make_sharedはshared_ptr用の管理領域も含めてメモリ確保するので少し早いらしい。でも問題もあるようだ。↓

C++プログラマーよ!std::make_sharedを安易に使うべからず! - 株式会社CFlatの明後日スタイルのブログ
http://cflat-inc.hatenablog.com/entry/2014/01/20/214551

このコメント欄より

make_shared で確保されたメモリ領域は,それを参照する weak_ptr が無くならない限り解放されない - 野良C++erの雑記帳 -
http://d.hatena.ne.jp/gintenlabo/20130404/1365059185

殆どの実装では, std::weak_ptr は 参照カウントを確認することで 対象のオブジェクトが破棄されたか否かを判別している.

std::make_shared は,オブジェクトと参照カウントを一回のメモリ確保で連続した領域に確保するため,

std::weak_ptr が残っている限り,参照カウントのメモリ領域は解放することができず,

従って,それと同時に確保されたオブジェクトのメモリ領域も解放することができない,という理屈.

weak_ptrのvectorで参照するとオブジェクトの開放ができなくなるといっている。なぜ?weak_ptrは参照カウンタを増やさないのでオブジェクトの開放を妨げないのでは・・・・。

・・・・

実験してみると shared_ptr は2つのオブジェクトで出来ている。
一つは対象のオブジェクト、もう一つはカウンタ。
weak_ptrは対象のオブジェクトを開放することは阻害しないが、カウンタ部分の開放は阻害する、ということなのかな。

スマートポインタについて整理

  • 概念

スマートポインタはオブジェクトの開放(つまりdelete)を自動化することでリソースリーク等の問題を防ぐためのもの。

  • auto_ptr

T型オブジェクトへのポインタを持ちデスクトラクタでdelete(T)する。参照カウンタを持たないのでこのスマートポインタをコピーすると二重参照になってしまうのでコピー不可。このためSTLで使うことができない。

  • unique_ptr

オブジェクトへの参照が一人だけであることを強制するスマートポインタ。コピーでなくムーブ(std::move)を使うことで参照元を変えることができる。

  • shared_ptr

参照カウンタを持つことで、そのオブジェクトへの複数の参照を可能にしたスマートポインタ。コピーをすると参照カウンタがインクリメントされる。参照カウンタが0になるとdeleteされる。

  • weak_ptr

shared_ptrの循環参照問題を解決するために導入されたもの。wake_ptrはshared_ptrの指すオブジェクトを参照するが、参照カウンタはインクリメントされない。

weak_ptrのデストラクタは何もしない。なら、結局生のポインタでもいいように思うが、参照先のオブジェクトの有無が分かるところがメリット。但しアクセスには注意が必要
http://boost.cppll.jp/HEAD/libs/smart_ptr/weak_ptr.htm
・・・・・
deleteで何もしないわけじゃなく、カウンタへの参照を無くす処理は走る?
未確認