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

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 feverG.j. Darma
 
John Rhodes - DevOps Automated Testing
John Rhodes - DevOps Automated TestingJohn Rhodes - DevOps Automated Testing
John Rhodes - DevOps Automated TestingJohn Zozzaro
 
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 accidentJose Pozo Riffo
 
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 membersGlobeBill
 
JJWF Tailgate 2014.compressed
JJWF Tailgate 2014.compressedJJWF Tailgate 2014.compressed
JJWF Tailgate 2014.compressedChellee Siewert
 
Botany= leaf morphology
Botany= leaf morphologyBotany= leaf morphology
Botany= leaf morphologyZizsis Sisziz
 
Unit 1 what is marketing
Unit 1 what is marketingUnit 1 what is marketing
Unit 1 what is marketingAngie 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
 
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 2016Christa Bidgood
 
หลวงพ่อตอบปัญหาธรรม ๖
หลวงพ่อตอบปัญหาธรรม ๖หลวงพ่อตอบปัญหาธรรม ๖
หลวงพ่อตอบปัญหาธรรม ๖Manoonpong Srivirat
 
Morning and evening_duas
Morning and evening_duasMorning and evening_duas
Morning and evening_duasAttaUllah Khan
 
Como Funciona Intenet
Como Funciona IntenetComo Funciona Intenet
Como Funciona Intenetguest4ef592
 

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 専用)

.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.ICLyak1ex
 
Boost9 session
Boost9 sessionBoost9 session
Boost9 sessionfreedom404
 
今日からできる!簡単 .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
 
○○大学の本当にあった怖い話
○○大学の本当にあった怖い話○○大学の本当にあった怖い話
○○大学の本当にあった怖い話idkqh7 Nishino
 
Wrapping a C++ library with Cython
Wrapping a C++ library with CythonWrapping a C++ library with Cython
Wrapping a C++ library with Cythonfuzzysphere
 
Boost.Flyweight
Boost.FlyweightBoost.Flyweight
Boost.Flyweightgintenlabo
 
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
 
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~Fujio Kojima
 
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)Hiro H.
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
Dive into RTS - another side
Dive into RTS - another sideDive into RTS - another side
Dive into RTS - another sideKiwamu 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

左と右の話
左と右の話左と右の話
左と右の話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
 

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

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)Hiroshi Tomioka
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Recently uploaded (8)

自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

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.