Submit Search
Scope Exit
5 likes
1,649 views
Akira Takahashi
1 of 10
Download now
Downloaded 22 times
1
2
3
4
5
6
7
8
9
10
More Related Content
PDF
Python02
XMLProJ2014
PPT
Online schema change in mysql casual #1(2010/12/11)
Naritoshi Hayashi
PDF
trueコマンドに0以外の終了コードをはかせる方法
mutz0623
PPTX
Javascript basic code
Shinsuke Matsuda
KEY
01 php7
Satoshi Yoshimura
KEY
Unix3
Takaya Kotohata
PPT
symfony 1.2を支えるサブフレームワーク
Katsuhiro Ogawa
PPTX
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Satoshi Mimura
Python02
XMLProJ2014
Online schema change in mysql casual #1(2010/12/11)
Naritoshi Hayashi
trueコマンドに0以外の終了コードをはかせる方法
mutz0623
Javascript basic code
Shinsuke Matsuda
01 php7
Satoshi Yoshimura
Unix3
Takaya Kotohata
symfony 1.2を支えるサブフレームワーク
Katsuhiro Ogawa
APASEC 2013 - ROP/JIT を使わずに DEP/ASLR を回避する手法を見てみた。
Satoshi Mimura
What's hot
(8)
PDF
Goの文法の実例と解説
Ryuji Iwata
PDF
Local php-100828 2
Akio Ishida
PDF
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
CODE BLUE
PDF
WebAPIではじめるphp入門
Hiroaki Murayama
PDF
JavaScript 講習会 #1
Susisu
PPTX
Java並行処理プログラミング 第16章ver2
Takinami Kei
PDF
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
PDF
補足資料 太陽電池モデリング教材
Tsuyoshi Horigome
Goの文法の実例と解説
Ryuji Iwata
Local php-100828 2
Akio Ishida
リナックスに置ける様々なリモートエキスプロイト手法 by スクハー・リー
CODE BLUE
WebAPIではじめるphp入門
Hiroaki Murayama
JavaScript 講習会 #1
Susisu
Java並行処理プログラミング 第16章ver2
Takinami Kei
Android Lecture #03 @PRO&BSC Inc.
Yuki Higuchi
補足資料 太陽電池モデリング教材
Tsuyoshi Horigome
Ad
Similar to Scope Exit
(20)
PDF
C++勉強会
mitsutaka_takeda
PDF
Continuation with Boost.Context
Akira Takahashi
PDF
オブジェクト指向できていますか?
Moriharu Ohzu
PDF
Pfi Seminar 2010 1 7
Preferred Networks
PDF
Boost Tour 1_58_0 merge
Akira Takahashi
PDF
C#coding guideline その2_20130325
Yoshihisa Ozaki
PDF
マーク&スイープ勉強会
7shi
PDF
Replace Output Iterator and Extend Range JP
Akira Takahashi
PDF
Boost Tour 1.53.0 merge
Akira Takahashi
ODP
Boost9 session
freedom404
PPT
shared_ptr & weak_ptr (ppt 初版, DL 専用)
Cryolite
PPTX
ぱっと見でわかるC++11
えぴ 福田
PDF
後戻りのある手続き型プログラミング
Naohiro Yoshikawa
PDF
イマドキC++erのモテカワリソース管理術
Kohsuke Yuasa
PDF
Boost.Coroutine
melpon
PDF
Howtoよいデザイン
Hiroki Yagita
PDF
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
PPT
オブジェクト指向入門7
Kenta Hattori
ODP
Buffer overflow
ionis111
PPT
プログラミングで言いたい聞きたいこと集
tecopark
C++勉強会
mitsutaka_takeda
Continuation with Boost.Context
Akira Takahashi
オブジェクト指向できていますか?
Moriharu Ohzu
Pfi Seminar 2010 1 7
Preferred Networks
Boost Tour 1_58_0 merge
Akira Takahashi
C#coding guideline その2_20130325
Yoshihisa Ozaki
マーク&スイープ勉強会
7shi
Replace Output Iterator and Extend Range JP
Akira Takahashi
Boost Tour 1.53.0 merge
Akira Takahashi
Boost9 session
freedom404
shared_ptr & weak_ptr (ppt 初版, DL 専用)
Cryolite
ぱっと見でわかるC++11
えぴ 福田
後戻りのある手続き型プログラミング
Naohiro Yoshikawa
イマドキC++erのモテカワリソース管理術
Kohsuke Yuasa
Boost.Coroutine
melpon
Howtoよいデザイン
Hiroki Yagita
C# コーディングガイドライン 2013/02/26
Yoshihisa Ozaki
オブジェクト指向入門7
Kenta Hattori
Buffer overflow
ionis111
プログラミングで言いたい聞きたいこと集
tecopark
Ad
More from Akira Takahashi
(20)
PPTX
Cpp20 overview language features
Akira Takahashi
PDF
Cppmix 02
Akira Takahashi
PPTX
Cppmix 01
Akira Takahashi
PDF
Modern C++ Learning
Akira Takahashi
PDF
cpprefjp documentation
Akira Takahashi
PDF
C++1z draft
Akira Takahashi
PDF
Boost tour 1_61_0 merge
Akira Takahashi
PDF
Boost tour 1_61_0
Akira Takahashi
PDF
error handling using expected
Akira Takahashi
PDF
Boost tour 1.60.0 merge
Akira Takahashi
PDF
Boost tour 1.60.0
Akira Takahashi
PDF
Boost container feature
Akira Takahashi
PDF
Boost Tour 1_58_0
Akira Takahashi
PDF
C++14 solve explicit_default_constructor
Akira Takahashi
PDF
C++14 enum hash
Akira Takahashi
PDF
Multi paradigm design
Akira Takahashi
PDF
Start Concurrent
Akira Takahashi
PDF
Programmer mind
Akira Takahashi
PDF
Boost.Study 14 Opening
Akira Takahashi
PDF
Executors and schedulers
Akira Takahashi
Cpp20 overview language features
Akira Takahashi
Cppmix 02
Akira Takahashi
Cppmix 01
Akira Takahashi
Modern C++ Learning
Akira Takahashi
cpprefjp documentation
Akira Takahashi
C++1z draft
Akira Takahashi
Boost tour 1_61_0 merge
Akira Takahashi
Boost tour 1_61_0
Akira Takahashi
error handling using expected
Akira Takahashi
Boost tour 1.60.0 merge
Akira Takahashi
Boost tour 1.60.0
Akira Takahashi
Boost container feature
Akira Takahashi
Boost Tour 1_58_0
Akira Takahashi
C++14 solve explicit_default_constructor
Akira Takahashi
C++14 enum hash
Akira Takahashi
Multi paradigm design
Akira Takahashi
Start Concurrent
Akira Takahashi
Programmer mind
Akira Takahashi
Boost.Study 14 Opening
Akira Takahashi
Executors and schedulers
Akira Takahashi
Scope Exit
1.
メンバ変数のメンバ関数内での
リソース管理 高橋晶(Akira Takahashi) id:faith_and_brave @cpp_akira Boost.勉強会 #8 大阪 2012/02/11(土)
2.
RAII • C++には、RAII(Resource Acquisition
Is Initialization:リソース 確保は初期化である)というイディオムがある。 • 簡単に言えば、確保したリソースはデストラクタで自動的に 解放する、というもの。 void f() { File file; file.open("a.txt"); if (!file.write("xxxxxxxx")) { return; // 途中で抜けてもファイルは閉じられる } } // ファイルが閉じられる • これはローカル変数には非常に有効。
3.
メンバ変数のリソース管理 • メンバ変数の寿命がクラスと同じでよければ、RAIIが有用。 class X
{ std::vector<User> users; public: ~X() { } // ここでusersが解放される };
4.
ケーススタディ ボタンの設計を考えてみよう class Button { public:
void down(); // ボタン押した void up(); // ボタン離した bool is_down() const; // ボタン押されてる? bool in_rect(Point p) const; // ある点が範囲内かを判定 }; down(), up()関数ではそれぞれ、ボタンの押下状態によって 表示画像を切替える処理が入っているとする。 ボタンが離されたら確実にup()関数を呼びたい。 どうするか?
5.
ケーススタディ ボタンを包含する画面クラスはこんな感じになるでしょう。 class View {
Button ok_button; public: void on_down(Point p) { if (ok_button.in_rect(p)) // 範囲内なら押す ok_button.down(); } void on_up() { if (ok_button.is_down()) { // 押されていたら離して押下処理 ok_button.up(); on_ok_button(); } } void on_ok_button() {} // OKボタンが押された };
6.
ケーススタディ この設計だと、ボタンが複数あると破綻する。 class View {
Button ok_button, cancel_button; public: … void on_up() { if (ok_button.is_down()) { // 押されていたら離して押下処理 ok_button.up(); on_ok_button(); return; // 余計な処理はしないで終了 } if (cancel_button.is_down()) { cancel_button.up(); // ボタンが離されない可能性がある on_cancel_button(); return; } } … };
7.
ケーススタディ 離されたら、全てのボタンが確実にup状態になるようにしたい。 Boost.ScopeExitを使おう。 void on_up() {
BOOST_SCOPE_EXIT((&)) { // スコープを抜けたら全てのボタンを離す ok_button.up(); cancel_button.up(); }; if (ok_button.is_down()) { // 押されていたら離して押下処理 on_ok_button(); return; // 全てのボタンが離される } if (cancel_button.is_down()) { on_cancel_button(); return; // 全てのボタンが離される } } // 全てのボタンが離される これで、メンバ変数が、特定のメンバ関数の抜けた際に、指定 した処理を確実に行わせることができるようになった。
8.
Boost.ScopeExit Boost.ScopeExitは、スコープを抜ける際に実行されるブロックを 記述するためのライブラリ。 int value =
0; void f() { value = 1; BOOST_SCOPE_EXIT((&)) { // スコープを抜ける際に実行されるブロック value = 3; }; value = 2; } f(); assert(value == 3); Boost.ScopeExitがやっていることは、デストラクタでそのブロック を実行するクラスとそのオブジェクトを自動生成してるだけ。
9.
Scoped Lockingパターン Scope Exitの目的特化した例として、Scoped
Lockingパターンと いうのがある。 class Logger { Mutex mutex_; public: void write(const std::string& s) { LockGuard<Mutex> lock(mutex_); // ロックする … } // スコープ抜けたらロック解除 }; 複数ヶ所でロックされる可能性のあるミューテックスを、 それぞれの処理が終わった段階で確実にアンロックする。
10.
まとめ • RAIIはとても便利だが、メンバ変数をメンバ関数内で自動的
に解放処理したい場合には、もう一つのRAIIを用意する必要 がある。 • Boost.ScopeExitはこの手間を減らしてくれる。 • Scoped Locking Patternのように、いろいろな個所で同じことを するならScopeExitを直接使うのではなくライブラリ化しよう。
Download