SlideShare una empresa de Scribd logo
1 de 85
shared_ptr & weak_ptr くらいおらいと http://twitter.com/Cryolite/
キーワードは 所有  ( ownership ) ,[object Object],[object Object],[object Object]
所有とは… ,[object Object],[object Object]
所有を制するものが  C++  を制する ,[object Object],[object Object],[object Object],[object Object]
所有の種類と例 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
共有は難しい
共有は難しい 私が片付けましょう
共有は難しい 私が片付けましょう いえいえ,ここは 私が片付けましょう
共有は難しい 私が片付けましょう いえいえ,ここは 私が片付けましょう え,ちょ,俺まだ使ってる
shared_ptr –  共有を 所有カウント で簡単・安全に扱う 1 共有されるもの 所有カウント
shared_ptr –  共有を 所有カウント で簡単・安全に扱う 2 共有されるもの 所有カウント
shared_ptr –  共有を 所有カウント で簡単・安全に扱う 3 共有されるもの 所有カウント
shared_ptr –  共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント
shared_ptr –  共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント 所有カウントが 0 になったら 片づけを実行
所有カウントは所有の 権利を保障 する 1 共有されるもの 所有カウント 所有の権利: 誰かが所有していれば 勝手に片付けるな O.K.
所有カウントは所有の 義務を履行 する 0 共有されるもの 所有カウントが0になれば後片付け処理を実行 所有の義務: 1度だけ, 確実に, 片付け 所有カウント O.K.
shared_ptr –  共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント
shared_ptr –  共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr
shared_ptr  は所有 ( の義務と権利 ) とポインタだ ,[object Object],[object Object],[object Object],強いポインタ 所有しているものとポインタが 指しているものを一致させる delete  だけじゃない
shared_ptr  の基本 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
shared_ptr  の基本 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],ポインタとして動作 + 権利を保障  ( 参照外しが安全 )
shared_ptr  の基本 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],ポインタとして動作 + 権利を保障  ( 参照外しが安全 ) 義務を履行
shared_ptr – int  と同程度にスレッド安全 4 共有されるもの 所有カウント カウントの変化は 同期保護 shared_ptr shared_ptr shared_ptr shared_ptr
所有カウントは循環所有を扱えない 1 1 所有 所有 所有カウントが永遠に非 0
発表終わり
shared_ptr  の重要なデザインゴール ,[object Object],[object Object],所有の共有・受け渡しを表現する 標準インタフェイスの確立
オレオレスマートポインタ ,[object Object],[object Object],[object Object]
オレオレスマートポインタ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
オレオレスマートポインタ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],「所有」は型に現れない = コンストラクタで「所有」が決まる shared_ptr  の 「所有」は型に現れない ポイント 2 ポイント 1
所有しない ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
所有しない ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],「所有」は型に現れない = コンストラクタで「所有」が決まる shared_ptr  の 「所有」は型に現れない ポイント 2 ポイント 1
バイナリ境界を越える int main(){ int *p = new int(42); f(p); p = 0; ..... } void f(int *p){ ..... ..... delete p; } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) 異なるコンパイル設定の  new  と  delete  の 組み合わせは環境によってはダウト
バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド )
バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) デバッグビルドの  delete  をここで設定
バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) デバッグビルドの  delete  をここで設定 デバッグビルドの  delete  が呼び出される
バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) デバッグビルドの  delete  が呼び出される デバッグビルドの  delete  をここで設定 どの  delete  が設定されていようが バイナリ互換性を維持
所有だけの  shared_ptr shared_ptr<int> p(new int(42)); //  (A) shared_ptr<void> q = p; p.reset(); //  以下,  (A)   で生成した  int  は  q  が所有
shared_ptr<void>  による遅延解放 ,[object Object],[object Object],[object Object],[object Object],[object Object]
shared_ptr<void>  による遅延解放 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
weak_ptr 4,  2 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr weak_ptr weak_ptr 弱いカウント
weak_ptr 0,  2 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr weak_ptr weak_ptr 弱いカウント
weak_ptr 0,  2 共有されるもの 所有カウント weak_ptr weak_ptr 弱いカウント 所有カウントが 0 になったら 片づけを実行
weak_ptr 0,  2 所有カウント weak_ptr weak_ptr 弱いカウント
weak_ptr 0,  0 所有カウント weak_ptr weak_ptr 弱いカウント
weak_ptr 0,   0 weak_ptr weak_ptr 弱いカウントが 0 になったら カウントオブジェクトを片付け
weak_ptr  にできること – その 1 4,  2 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr weak_ptr weak_ptr 弱いカウント 「所有カウントが 0 かどうか?」に答える weak_ptr::expired == false
weak_ptr  にできること – その 1 0,  2 所有カウント weak_ptr weak_ptr 弱いカウント 「所有カウントが 0 かどうか?」に答える weak_ptr::expired == true
weak_ptr  にできること – その 1 0,  2 所有カウント weak_ptr weak_ptr 弱いカウント 「所有カウントが 0 かどうか?」に答える = 「対象が死んでいるかどうか?」に答える
weak_ptr  にできること – その 2 1,  2 共有されるもの 所有カウント shared_ptr weak_ptr weak_ptr 弱いカウント 対象が生きていたら,それを 所有する  shared_ptr  を作り出せる
weak_ptr  にできること – その 2 2,  2 共有されるもの 所有カウント shared_ptr weak_ptr weak_ptr 弱いカウント shared_ptr 対象が生きていたら,それを 所有する  shared_ptr  を作り出せる
weak_ptr  にできること – その 2 0,  2 所有カウント weak_ptr weak_ptr 弱いカウント 対象が死んでいたら空の  shared_ptr  しか取り出せない
weak_ptr  にできること – その 2 0,  2 所有カウント weak_ptr weak_ptr 弱いカウント shared_ptr 対象が死んでいたら空の  shared_ptr  しか取り出せない
weak_ptr  にできることのまとめ ,[object Object],[object Object]
weak_ptr  の基本 ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
生ポインタから  shared_ptr  を取得したい ,[object Object],[object Object],[object Object],[object Object]
this  への  shared_ptr ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
this  への  shared_ptr  はダメ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
this  への  shared_ptr  はダメ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],X X::shared_ptr this_ クラスオブジェクトは メンバ変数を所有 所有 Q.  なぜダメか? A.  所有が循環しているのでダメ
weak_ptr  の使い方 –  this  への  weak_ptr ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
weak_ptr の使い方 –  this  への  weak_ptr ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],参考:  boost::enable_shared_from_this
Observer (Publisher/Subscriber)
Observer でよくある事故
Observer でよくある事故 死んだオブジェクトにアクセス
安全な Observer ,[object Object],[object Object]
安全な Observer void Publisher::subscribe(function<void ()> call_back, weak_ptr<void> wp); shared_ptr<Subscriber1> p… Publisher::subscribe( bind(&Subscriber1::notifyEvent, p.get()), p);
安全な Observer weak_ptr<void> wp…; // subscriber  への  weak_ptr if (shared_ptr<void> p = wp.lock()) { call_back(); }
安全な Observer … ということが  Boost.Signal2  で出来ます 鍵は  weak_ptr<void> & shared_ptr<void>
オブジェクト間グローバルマッピング a b c share_ptr share_ptr share_ptr share_ptr
オブジェクト間グローバルマッピング a b c map<void *, Y> g_map; //  グローバル y1 y2 y3 share_ptr share_ptr share_ptr share_ptr
オブジェクト間グローバルマッピング a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c  が消えると… map<void *, Y> g_map; //  グローバル
オブジェクト間グローバルマッピング a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c  が消えると… 無駄なマップエントリ ( デッドマップ )  が発生 map<void *, Y> g_map; //  グローバル
策 1.  キーを  weak_ptr  にして適度にクリーンアップ a b c map< weak_ptr<void> , Y> g_map; y1 y2 y3 share_ptr share_ptr
策 1.  キーを  weak_ptr  にして適度にクリーンアップ a b c map< weak_ptr<void> , Y> g_map; y1 y2 y3 share_ptr share_ptr //  以下を適度に実行 for ( auto  i = g_map.begin(); i != g_map.end();) { if (i->first.expired()) g_map.erase(i++); else ++i; }
策 1.  キーを  weak_ptr  にして適度にクリーンアップ a b c map< weak_ptr<void> , Y> g_map; y1 y2 y3 share_ptr share_ptr デッドマップが適度に解消される
策2. マップエントリも所有する a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr map<void *, Y>
策2. マップエントリも所有する a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr map<void *, Y> struct D{ map<void *, Y> &m_; void operator()(void *p){ m_.erase(p); delete p; } }; D d(g_map); shared_ptr<C> pc(new C(), D(g_map)); g_map.insert(make_pair(pc.get(), Y(…)));
策2. マップエントリも所有する a b c map<void *, Y> y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c  を所有する  shared_ptr  がなくなると…
策2. マップエントリも所有する a b c unordered_map<void const *, Y> y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c  を所有する  shared_ptr  がなくなると… c  をキーとするエントリも自動で  erase
循環所有を何とかする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
循環所有を何とかする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],X Y 所有 所有 ?
循環所有を何とかする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],X Y shared_ptr 所有 所有
循環所有を何とかする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],X Y shared_ptr 所有 所有 ポイント shared_ptr<X>
循環所有を何とかする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],X Y shared_ptr 所有 所有 shared_ptr<Y> ポイント
循環所有を何とかする ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],X Y shared_ptr 所有 所有 shared_ptr<Y> ポイント
まとめ ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]

Más contenido relacionado

La actualidad más candente

C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案yohhoy
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~CHY72
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかYuki Miyatake
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜勝成 鈴江
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときShintarou Okada
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編egtra
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプKohsuke Yuasa
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.ContextAkira Takahashi
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutinemelpon
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013Ryo Sakamoto
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!Akihiro Nishimura
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門Norishige Fukushima
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)Akihiko Matuura
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_optionsnyaocat
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論MITSUNARI Shigeo
 

La actualidad más candente (20)

Map
MapMap
Map
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
boost tour 1.48.0 all
boost tour 1.48.0 allboost tour 1.48.0 all
boost tour 1.48.0 all
 
最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)最新C++事情 C++14-C++20 (2018年10月)
最新C++事情 C++14-C++20 (2018年10月)
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 
templateとautoの型推論
templateとautoの型推論templateとautoの型推論
templateとautoの型推論
 
Boost Tour 1.50.0 All
Boost Tour 1.50.0 AllBoost Tour 1.50.0 All
Boost Tour 1.50.0 All
 

Similar a shared_ptr & weak_ptr (ppt 初版, DL 専用)

わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICLyak1ex
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話idkqh7 Nishino
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 TipsTakaaki Suzuki
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competitionyak1ex
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]yak1ex
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelereaseShiqiao Du
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用Shintaro Fukushima
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 

Similar a shared_ptr & weak_ptr (ppt 初版, DL 専用) (20)

わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話
 
Boost tour 1_44_0
Boost tour 1_44_0Boost tour 1_44_0
Boost tour 1_44_0
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]
 
Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7Pfi Seminar 2010 1 7
Pfi Seminar 2010 1 7
 
Cython intro prelerease
Cython intro prelereaseCython intro prelerease
Cython intro prelerease
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
統計解析言語Rにおける大規模データ管理のためのboost.interprocessの活用
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 

Más de Cryolite

左と右の話
左と右の話左と右の話
左と右の話Cryolite
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_finalCryolite
 
Allocators@C++11
Allocators@C++11Allocators@C++11
Allocators@C++11Cryolite
 
家に帰るまでが遠足です
家に帰るまでが遠足です家に帰るまでが遠足です
家に帰るまでが遠足ですCryolite
 
Destructive Call
Destructive CallDestructive Call
Destructive CallCryolite
 
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Cryolite
 
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Cryolite
 

Más de Cryolite (7)

左と右の話
左と右の話左と右の話
左と右の話
 
Lambda in template_final
Lambda in template_finalLambda in template_final
Lambda in template_final
 
Allocators@C++11
Allocators@C++11Allocators@C++11
Allocators@C++11
 
家に帰るまでが遠足です
家に帰るまでが遠足です家に帰るまでが遠足です
家に帰るまでが遠足です
 
Destructive Call
Destructive CallDestructive Call
Destructive Call
 
Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)Boost.PropertyMap (.pptx)
Boost.PropertyMap (.pptx)
 
Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)Boost.PropertyMap (.pdf)
Boost.PropertyMap (.pdf)
 

Último

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 

Último (10)

Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 

shared_ptr & weak_ptr (ppt 初版, DL 専用)

  • 1. shared_ptr & weak_ptr くらいおらいと http://twitter.com/Cryolite/
  • 2.
  • 3.
  • 4.
  • 5.
  • 9. 共有は難しい 私が片付けましょう いえいえ,ここは 私が片付けましょう え,ちょ,俺まだ使ってる
  • 10. shared_ptr – 共有を 所有カウント で簡単・安全に扱う 1 共有されるもの 所有カウント
  • 11. shared_ptr – 共有を 所有カウント で簡単・安全に扱う 2 共有されるもの 所有カウント
  • 12. shared_ptr – 共有を 所有カウント で簡単・安全に扱う 3 共有されるもの 所有カウント
  • 13. shared_ptr – 共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント
  • 14. shared_ptr – 共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント 所有カウントが 0 になったら 片づけを実行
  • 15. 所有カウントは所有の 権利を保障 する 1 共有されるもの 所有カウント 所有の権利: 誰かが所有していれば 勝手に片付けるな O.K.
  • 16. 所有カウントは所有の 義務を履行 する 0 共有されるもの 所有カウントが0になれば後片付け処理を実行 所有の義務: 1度だけ, 確実に, 片付け 所有カウント O.K.
  • 17. shared_ptr – 共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント
  • 18. shared_ptr – 共有を 所有カウント で簡単・安全に扱う 4 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr
  • 19.
  • 20.
  • 21.
  • 22.
  • 23. shared_ptr – int と同程度にスレッド安全 4 共有されるもの 所有カウント カウントの変化は 同期保護 shared_ptr shared_ptr shared_ptr shared_ptr
  • 24. 所有カウントは循環所有を扱えない 1 1 所有 所有 所有カウントが永遠に非 0
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32. バイナリ境界を越える int main(){ int *p = new int(42); f(p); p = 0; ..... } void f(int *p){ ..... ..... delete p; } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) 異なるコンパイル設定の new と delete の 組み合わせは環境によってはダウト
  • 33. バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド )
  • 34. バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) デバッグビルドの delete をここで設定
  • 35. バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) デバッグビルドの delete をここで設定 デバッグビルドの delete が呼び出される
  • 36. バイナリ境界を越える int main(){ shared_ptr<int> p(new int(42)); f(p); p.reset(); ..... } void f(shared_ptr<int> p){ ..... ..... p.reset(); } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) デバッグビルドの delete が呼び出される デバッグビルドの delete をここで設定 どの delete が設定されていようが バイナリ互換性を維持
  • 37. 所有だけの shared_ptr shared_ptr<int> p(new int(42)); // (A) shared_ptr<void> q = p; p.reset(); // 以下, (A) で生成した int は q が所有
  • 38.
  • 39.
  • 40. weak_ptr 4, 2 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr weak_ptr weak_ptr 弱いカウント
  • 41. weak_ptr 0, 2 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr weak_ptr weak_ptr 弱いカウント
  • 42. weak_ptr 0, 2 共有されるもの 所有カウント weak_ptr weak_ptr 弱いカウント 所有カウントが 0 になったら 片づけを実行
  • 43. weak_ptr 0, 2 所有カウント weak_ptr weak_ptr 弱いカウント
  • 44. weak_ptr 0, 0 所有カウント weak_ptr weak_ptr 弱いカウント
  • 45. weak_ptr 0, 0 weak_ptr weak_ptr 弱いカウントが 0 になったら カウントオブジェクトを片付け
  • 46. weak_ptr にできること – その 1 4, 2 共有されるもの 所有カウント shared_ptr shared_ptr shared_ptr shared_ptr weak_ptr weak_ptr 弱いカウント 「所有カウントが 0 かどうか?」に答える weak_ptr::expired == false
  • 47. weak_ptr にできること – その 1 0, 2 所有カウント weak_ptr weak_ptr 弱いカウント 「所有カウントが 0 かどうか?」に答える weak_ptr::expired == true
  • 48. weak_ptr にできること – その 1 0, 2 所有カウント weak_ptr weak_ptr 弱いカウント 「所有カウントが 0 かどうか?」に答える = 「対象が死んでいるかどうか?」に答える
  • 49. weak_ptr にできること – その 2 1, 2 共有されるもの 所有カウント shared_ptr weak_ptr weak_ptr 弱いカウント 対象が生きていたら,それを 所有する shared_ptr を作り出せる
  • 50. weak_ptr にできること – その 2 2, 2 共有されるもの 所有カウント shared_ptr weak_ptr weak_ptr 弱いカウント shared_ptr 対象が生きていたら,それを 所有する shared_ptr を作り出せる
  • 51. weak_ptr にできること – その 2 0, 2 所有カウント weak_ptr weak_ptr 弱いカウント 対象が死んでいたら空の shared_ptr しか取り出せない
  • 52. weak_ptr にできること – その 2 0, 2 所有カウント weak_ptr weak_ptr 弱いカウント shared_ptr 対象が死んでいたら空の shared_ptr しか取り出せない
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 64.
  • 65. 安全な Observer void Publisher::subscribe(function<void ()> call_back, weak_ptr<void> wp); shared_ptr<Subscriber1> p… Publisher::subscribe( bind(&Subscriber1::notifyEvent, p.get()), p);
  • 66. 安全な Observer weak_ptr<void> wp…; // subscriber への weak_ptr if (shared_ptr<void> p = wp.lock()) { call_back(); }
  • 67. 安全な Observer … ということが Boost.Signal2 で出来ます 鍵は weak_ptr<void> & shared_ptr<void>
  • 68. オブジェクト間グローバルマッピング a b c share_ptr share_ptr share_ptr share_ptr
  • 69. オブジェクト間グローバルマッピング a b c map<void *, Y> g_map; // グローバル y1 y2 y3 share_ptr share_ptr share_ptr share_ptr
  • 70. オブジェクト間グローバルマッピング a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c が消えると… map<void *, Y> g_map; // グローバル
  • 71. オブジェクト間グローバルマッピング a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c が消えると… 無駄なマップエントリ ( デッドマップ ) が発生 map<void *, Y> g_map; // グローバル
  • 72. 策 1. キーを weak_ptr にして適度にクリーンアップ a b c map< weak_ptr<void> , Y> g_map; y1 y2 y3 share_ptr share_ptr
  • 73. 策 1. キーを weak_ptr にして適度にクリーンアップ a b c map< weak_ptr<void> , Y> g_map; y1 y2 y3 share_ptr share_ptr // 以下を適度に実行 for ( auto i = g_map.begin(); i != g_map.end();) { if (i->first.expired()) g_map.erase(i++); else ++i; }
  • 74. 策 1. キーを weak_ptr にして適度にクリーンアップ a b c map< weak_ptr<void> , Y> g_map; y1 y2 y3 share_ptr share_ptr デッドマップが適度に解消される
  • 75. 策2. マップエントリも所有する a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr map<void *, Y>
  • 76. 策2. マップエントリも所有する a b c y1 y2 y3 share_ptr share_ptr share_ptr share_ptr map<void *, Y> struct D{ map<void *, Y> &m_; void operator()(void *p){ m_.erase(p); delete p; } }; D d(g_map); shared_ptr<C> pc(new C(), D(g_map)); g_map.insert(make_pair(pc.get(), Y(…)));
  • 77. 策2. マップエントリも所有する a b c map<void *, Y> y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c を所有する shared_ptr がなくなると…
  • 78. 策2. マップエントリも所有する a b c unordered_map<void const *, Y> y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c を所有する shared_ptr がなくなると… c をキーとするエントリも自動で erase
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.