SlideShare a Scribd company logo
1 of 84
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],shared_ptr  の 「所有」は型に現れない ポイント 1 「所有」は型に現れない = コンストラクタで「所有」が決まる ポイント 2
バイナリ境界を越える – 生ポインタの場合 int main(){ int *p = new int(42); f(p); p = 0; ..... } void f(int *p){ ..... ..... delete p; } a.exe ( デバッグビルド ) b.dll ( リリースビルド ) 異なるコンパイル設定の  new  と  delete  の 組み合わせは環境によっては ダウト
バイナリ境界を越える –  shared_ptr  の場合 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 ( リリースビルド )
バイナリ境界を越える –  shared_ptr  の場合 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  をここで設定
バイナリ境界を越える –  shared_ptr  の場合 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  が呼び出される
バイナリ境界を越える –  shared_ptr  の場合 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  中だけ所有 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 map<void *, 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],[object Object]

More Related Content

What's hot

C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
yak1ex
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
egtra
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
melpon
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
Akira Takahashi
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
Norishige Fukushima
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
Satoshi Sato
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
 

What's hot (20)

ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
 
C++0x in programming competition
C++0x in programming competitionC++0x in programming competition
C++0x in programming competition
 
NetBSD/i386 割り込みベクタテーブル
NetBSD/i386 割り込みベクタテーブルNetBSD/i386 割り込みベクタテーブル
NetBSD/i386 割り込みベクタテーブル
 
新しい並列for構文のご提案
新しい並列for構文のご提案新しい並列for構文のご提案
新しい並列for構文のご提案
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
C++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプC++ ポインタ ブートキャンプ
C++ ポインタ ブートキャンプ
 
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうかBoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
 
最新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月)
 
C++11概要 ライブラリ編
C++11概要 ライブラリ編C++11概要 ライブラリ編
C++11概要 ライブラリ編
 
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
 
unique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるときunique_ptrにポインタ以外のものを持たせるとき
unique_ptrにポインタ以外のものを持たせるとき
 
すごいConstたのしく使おう!
すごいConstたのしく使おう!すごいConstたのしく使おう!
すごいConstたのしく使おう!
 
Boost.Coroutine
Boost.CoroutineBoost.Coroutine
Boost.Coroutine
 
Continuation with Boost.Context
Continuation with Boost.ContextContinuation with Boost.Context
Continuation with Boost.Context
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門組み込み関数(intrinsic)によるSIMD入門
組み込み関数(intrinsic)によるSIMD入門
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 
闇魔術を触ってみた
闇魔術を触ってみた闇魔術を触ってみた
闇魔術を触ってみた
 
オブジェクト指向できていますか?
オブジェクト指向できていますか?オブジェクト指向できていますか?
オブジェクト指向できていますか?
 
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
GPUが100倍速いという神話をぶち殺せたらいいな ver.2013
 

Viewers also liked

Thinkers keys treasure fever
Thinkers keys treasure feverThinkers keys treasure fever
Thinkers keys treasure fever
G.j. Darma
 
JJWF Tailgate 2014.compressed
JJWF Tailgate 2014.compressedJJWF Tailgate 2014.compressed
JJWF Tailgate 2014.compressed
Chellee Siewert
 
Botany= leaf morphology
Botany= leaf morphologyBotany= leaf morphology
Botany= leaf morphology
Zizsis Sisziz
 
Unit 1 what is marketing
Unit 1 what is marketingUnit 1 what is marketing
Unit 1 what is marketing
Angie Rogers
 
C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...
C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...
C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...
mike_asby_985
 
Como Funciona Intenet
Como Funciona IntenetComo Funciona Intenet
Como Funciona Intenet
guest4ef592
 

Viewers also liked (20)

Thinkers keys treasure fever
Thinkers keys treasure feverThinkers keys treasure fever
Thinkers keys treasure fever
 
Miarchivo
MiarchivoMiarchivo
Miarchivo
 
John Rhodes - DevOps Automated Testing
John Rhodes - DevOps Automated TestingJohn Rhodes - DevOps Automated Testing
John Rhodes - DevOps Automated Testing
 
Reading 2 medio a b-c- 2015 accident
Reading 2 medio a b-c- 2015 accidentReading 2 medio a b-c- 2015 accident
Reading 2 medio a b-c- 2015 accident
 
UFI Asia Seminar - Taipei 2010 - Kenny Lo
UFI Asia Seminar - Taipei 2010 - Kenny LoUFI Asia Seminar - Taipei 2010 - Kenny Lo
UFI Asia Seminar - Taipei 2010 - Kenny Lo
 
China association of payment and clearing review and its members
China association of payment and clearing review and its membersChina association of payment and clearing review and its members
China association of payment and clearing review and its members
 
JJWF Tailgate 2014.compressed
JJWF Tailgate 2014.compressedJJWF Tailgate 2014.compressed
JJWF Tailgate 2014.compressed
 
HOW TO BE BEHAVE IN CORPORATE CULTURE
HOW TO BE BEHAVE IN CORPORATE CULTUREHOW TO BE BEHAVE IN CORPORATE CULTURE
HOW TO BE BEHAVE IN CORPORATE CULTURE
 
Botany= leaf morphology
Botany= leaf morphologyBotany= leaf morphology
Botany= leaf morphology
 
Unit 1 what is marketing
Unit 1 what is marketingUnit 1 what is marketing
Unit 1 what is marketing
 
C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...
C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...
C6 gerald-grinstein-albert-langlois-simon-vandermeer-miko-sotto-otis-moore-le...
 
Htyty
HtytyHtyty
Htyty
 
Nht Global Newsletter English
Nht Global Newsletter EnglishNht Global Newsletter English
Nht Global Newsletter English
 
Letter of acadd services closure june 2016
Letter of acadd services closure june 2016Letter of acadd services closure june 2016
Letter of acadd services closure june 2016
 
หลวงพ่อตอบปัญหาธรรม ๖
หลวงพ่อตอบปัญหาธรรม ๖หลวงพ่อตอบปัญหาธรรม ๖
หลวงพ่อตอบปัญหาธรรม ๖
 
Comic1
Comic1Comic1
Comic1
 
Morning and evening_duas
Morning and evening_duasMorning and evening_duas
Morning and evening_duas
 
Outreach p4-math
Outreach p4-mathOutreach p4-math
Outreach p4-math
 
Como Funciona Intenet
Como Funciona IntenetComo Funciona Intenet
Como Funciona Intenet
 
DMD - Dear Mum and Dad intro
DMD - Dear Mum and Dad introDMD - Dear Mum and Dad intro
DMD - Dear Mum and Dad intro
 

Similar to shared_ptr & weak_ptr (ppt 第2版, DL 専用)

Boost9 session
Boost9 sessionBoost9 session
Boost9 session
freedom404
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話
idkqh7 Nishino
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
fuzzysphere
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
gintenlabo
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
Kiwamu Okabe
 

Similar to shared_ptr & weak_ptr (ppt 第2版, DL 専用) (20)

CLR/H No.35-2
CLR/H No.35-2CLR/H No.35-2
CLR/H No.35-2
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
Brief introduction of Boost.ICL
Brief introduction of Boost.ICLBrief introduction of Boost.ICL
Brief introduction of Boost.ICL
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 session
 
今日からできる!簡単 .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
 
Boost tour 1_44_0
Boost tour 1_44_0Boost tour 1_44_0
Boost tour 1_44_0
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cython
 
Emcpp item31
Emcpp item31Emcpp item31
Emcpp item31
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweight
 
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
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
 
emc++ chapter32
emc++ chapter32emc++ chapter32
emc++ chapter32
 
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another side
 
Effective modern-c++#9
Effective modern-c++#9Effective modern-c++#9
Effective modern-c++#9
 

More from 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)
 

Recently uploaded

Recently uploaded (11)

論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 

shared_ptr & weak_ptr (ppt 第2版, 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. バイナリ境界を越える – shared_ptr の場合 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. バイナリ境界を越える – shared_ptr の場合 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. バイナリ境界を越える – shared_ptr の場合 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. バイナリ境界を越える – shared_ptr の場合 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 中だけ所有 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 map<void *, Y> y1 y2 y3 share_ptr share_ptr share_ptr share_ptr c を所有する shared_ptr がなくなると… c をキーとするエントリも自動で erase
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.