Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
Kohsuke Yuasa
1,294 views
Sapporocpp#2 exception-primer
sapporo.cpp #2
Technology
◦
Business
◦
Read more
3
Save
Share
Embed
Embed presentation
Download
Downloaded 29 times
1
/ 144
2
/ 144
3
/ 144
4
/ 144
5
/ 144
6
/ 144
7
/ 144
8
/ 144
9
/ 144
10
/ 144
11
/ 144
12
/ 144
13
/ 144
14
/ 144
15
/ 144
16
/ 144
17
/ 144
18
/ 144
19
/ 144
20
/ 144
21
/ 144
22
/ 144
23
/ 144
24
/ 144
25
/ 144
26
/ 144
27
/ 144
28
/ 144
29
/ 144
30
/ 144
31
/ 144
32
/ 144
33
/ 144
34
/ 144
35
/ 144
36
/ 144
37
/ 144
38
/ 144
39
/ 144
40
/ 144
41
/ 144
42
/ 144
43
/ 144
44
/ 144
45
/ 144
46
/ 144
47
/ 144
48
/ 144
49
/ 144
50
/ 144
51
/ 144
52
/ 144
53
/ 144
54
/ 144
55
/ 144
56
/ 144
57
/ 144
58
/ 144
59
/ 144
60
/ 144
61
/ 144
62
/ 144
63
/ 144
64
/ 144
65
/ 144
66
/ 144
67
/ 144
68
/ 144
69
/ 144
70
/ 144
71
/ 144
72
/ 144
73
/ 144
74
/ 144
75
/ 144
76
/ 144
77
/ 144
78
/ 144
79
/ 144
80
/ 144
81
/ 144
82
/ 144
83
/ 144
84
/ 144
85
/ 144
86
/ 144
87
/ 144
88
/ 144
89
/ 144
90
/ 144
91
/ 144
92
/ 144
93
/ 144
94
/ 144
95
/ 144
96
/ 144
97
/ 144
98
/ 144
99
/ 144
100
/ 144
101
/ 144
102
/ 144
103
/ 144
104
/ 144
105
/ 144
106
/ 144
107
/ 144
108
/ 144
109
/ 144
110
/ 144
111
/ 144
112
/ 144
113
/ 144
114
/ 144
115
/ 144
116
/ 144
117
/ 144
118
/ 144
119
/ 144
120
/ 144
121
/ 144
122
/ 144
123
/ 144
124
/ 144
125
/ 144
126
/ 144
127
/ 144
128
/ 144
129
/ 144
130
/ 144
131
/ 144
132
/ 144
133
/ 144
134
/ 144
135
/ 144
136
/ 144
137
/ 144
138
/ 144
139
/ 144
140
/ 144
141
/ 144
142
/ 144
143
/ 144
144
/ 144
More Related Content
PDF
nakameguro_feature.cpp vol.8
by
yohhoy
PDF
C++ Transactional Memory言語拡張の紹介
by
yohhoy
PPTX
Effective Java 輪読会 項目74-75
by
Appresso Engineering Team
PDF
イマドキC++erのモテカワリソース管理術
by
Kohsuke Yuasa
PPTX
Javaプログラミング入門【第6回】
by
Yukiko Kato
PDF
cdev_write and_comwrite
by
kusabanachi
PDF
Kanazawa.js.Next
by
dynamis
PDF
C#coding guideline その2_20130325
by
Yoshihisa Ozaki
nakameguro_feature.cpp vol.8
by
yohhoy
C++ Transactional Memory言語拡張の紹介
by
yohhoy
Effective Java 輪読会 項目74-75
by
Appresso Engineering Team
イマドキC++erのモテカワリソース管理術
by
Kohsuke Yuasa
Javaプログラミング入門【第6回】
by
Yukiko Kato
cdev_write and_comwrite
by
kusabanachi
Kanazawa.js.Next
by
dynamis
C#coding guideline その2_20130325
by
Yoshihisa Ozaki
What's hot
PPTX
Sharing Deep Dive
by
Takaaki Suzuki
PDF
Synthesijer and Synthesijer.Scala in HLS-friends 201512
by
Takefumi MIYOSHI
PDF
Intel AVX2を使用したailia sdkの最適化
by
HitoshiSHINABE1
PPTX
冬のLock free祭り safe
by
Kumazaki Hiroki
PDF
Slide
by
Takefumi MIYOSHI
PDF
Javaセキュアコーディングセミナー東京第2回演習の解説
by
JPCERT Coordination Center
PDF
Visual C++コード分析を支えるSAL
by
egtra
PDF
20180123 power shell
by
Trainocate Japan, Ltd.
PDF
Secure scheme script suite
by
Tod Morita
PDF
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„
by
和弘 井之上
PDF
20130611 java concurrencyinpracticech7
by
Toshiaki Toyama
PPTX
Javaコーディング勉強会
by
inatus
PPTX
セキュアPHP
by
Matsuzawa Fumiaki
PPTX
signal の話 或いは Zend Signals とは何か
by
do_aki
PDF
4章 Linuxカーネル - 割り込み・例外 4
by
mao999
Sharing Deep Dive
by
Takaaki Suzuki
Synthesijer and Synthesijer.Scala in HLS-friends 201512
by
Takefumi MIYOSHI
Intel AVX2を使用したailia sdkの最適化
by
HitoshiSHINABE1
冬のLock free祭り safe
by
Kumazaki Hiroki
Slide
by
Takefumi MIYOSHI
Javaセキュアコーディングセミナー東京第2回演習の解説
by
JPCERT Coordination Center
Visual C++コード分析を支えるSAL
by
egtra
20180123 power shell
by
Trainocate Japan, Ltd.
Secure scheme script suite
by
Tod Morita
【C++BUILDER STARTER チュートリアルシリーズ】シーズン2 C++Builderの部 第1回 ‟シューティングゲームのプログラム„
by
和弘 井之上
20130611 java concurrencyinpracticech7
by
Toshiaki Toyama
Javaコーディング勉強会
by
inatus
セキュアPHP
by
Matsuzawa Fumiaki
signal の話 或いは Zend Signals とは何か
by
do_aki
4章 Linuxカーネル - 割り込み・例外 4
by
mao999
Similar to Sapporocpp#2 exception-primer
PDF
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
by
JPCERT Coordination Center
PDF
C# コーディングガイドライン 2013/02/26
by
Yoshihisa Ozaki
PDF
オブジェクト指向できていますか?
by
Moriharu Ohzu
PDF
GC in C++0x
by
yak1ex
PDF
C++勉強会
by
mitsutaka_takeda
PPTX
C2C++11Level1
by
Yuki Miyatake
PDF
Javaセキュアコーディングセミナー東京第3回講義
by
JPCERT Coordination Center
PDF
例外設計における大罪
by
Takuto Wada
PPTX
保守しやすいコードの反面教師 (アンチパターン) その1
by
keitasudo1
PDF
Pfi Seminar 2010 1 7
by
Preferred Networks
PDF
Processing
by
Akifumi Nambu
PDF
Javaセキュアコーディングセミナー東京第1回 講義
by
JPCERT Coordination Center
PPTX
セキュアコーディング方法論再構築の試み
by
Hiroshi Tokumaru
PDF
Javaセキュアコーディングセミナー東京第4回講義
by
JPCERT Coordination Center
PPTX
Who like C++ coding standard
by
Kiyoshi Ogawa
PDF
Javaセキュアコーディングセミナー東京第3回演習の解説
by
JPCERT Coordination Center
PDF
Javaセキュアコーディングセミナー東京第2回演習
by
JPCERT Coordination Center
PDF
Who enjoy a coding standard?
by
Kiyoshi Ogawa
PDF
関数プログラミング入門
by
Hideyuki Tanaka
PPTX
プログラマ人生論
by
ymmt
CERT コーディングスタンダードご紹介 (OSC2017@Osaka)
by
JPCERT Coordination Center
C# コーディングガイドライン 2013/02/26
by
Yoshihisa Ozaki
オブジェクト指向できていますか?
by
Moriharu Ohzu
GC in C++0x
by
yak1ex
C++勉強会
by
mitsutaka_takeda
C2C++11Level1
by
Yuki Miyatake
Javaセキュアコーディングセミナー東京第3回講義
by
JPCERT Coordination Center
例外設計における大罪
by
Takuto Wada
保守しやすいコードの反面教師 (アンチパターン) その1
by
keitasudo1
Pfi Seminar 2010 1 7
by
Preferred Networks
Processing
by
Akifumi Nambu
Javaセキュアコーディングセミナー東京第1回 講義
by
JPCERT Coordination Center
セキュアコーディング方法論再構築の試み
by
Hiroshi Tokumaru
Javaセキュアコーディングセミナー東京第4回講義
by
JPCERT Coordination Center
Who like C++ coding standard
by
Kiyoshi Ogawa
Javaセキュアコーディングセミナー東京第3回演習の解説
by
JPCERT Coordination Center
Javaセキュアコーディングセミナー東京第2回演習
by
JPCERT Coordination Center
Who enjoy a coding standard?
by
Kiyoshi Ogawa
関数プログラミング入門
by
Hideyuki Tanaka
プログラマ人生論
by
ymmt
More from Kohsuke Yuasa
PDF
オーディオ用レベルメータを作ってみよう
by
Kohsuke Yuasa
PDF
Juceで作るオーディオアプリケーション
by
Kohsuke Yuasa
PDF
C++ マルチスレッドプログラミング
by
Kohsuke Yuasa
PDF
最近のC++ @ Sapporo.cpp #5
by
Kohsuke Yuasa
PDF
規格書で読むC++11のスレッド
by
Kohsuke Yuasa
PDF
C++ ポインタ ブートキャンプ
by
Kohsuke Yuasa
PDF
Introduction to boost test
by
Kohsuke Yuasa
PDF
C++ template-primer
by
Kohsuke Yuasa
PDF
Read egg oven
by
Kohsuke Yuasa
PDF
Study3 boost
by
Kohsuke Yuasa
オーディオ用レベルメータを作ってみよう
by
Kohsuke Yuasa
Juceで作るオーディオアプリケーション
by
Kohsuke Yuasa
C++ マルチスレッドプログラミング
by
Kohsuke Yuasa
最近のC++ @ Sapporo.cpp #5
by
Kohsuke Yuasa
規格書で読むC++11のスレッド
by
Kohsuke Yuasa
C++ ポインタ ブートキャンプ
by
Kohsuke Yuasa
Introduction to boost test
by
Kohsuke Yuasa
C++ template-primer
by
Kohsuke Yuasa
Read egg oven
by
Kohsuke Yuasa
Study3 boost
by
Kohsuke Yuasa
Sapporocpp#2 exception-primer
1.
例外安全入門
@hotwatermorning
2.
自己紹介 ●
@hotwatermorning ● はてなid:heisesswasser ● 大学生 ● DTMやってます ● C++が好きです ● 「プログラミングの魔導少女」では 「RangeとPStade.Oven」という記事を書かせ ていただきました。
3.
C++erなら
4.
誰しもメモリーリークに
5.
悩まされたことがあるはず
6.
今回のセッションは
7.
その悩みを
8.
軽減する
9.
軽減する かもしれない
10.
本日のレシピ 1.例外安全とは? 2.例外安全性の種類 3.例外安全なコードを書くには 4.例外安全にするための技法
11.
本日のレシピ 1.例外安全とは? 2.例外安全性の種類 3.例外安全なコードを書くには 4.例外安全にするための技法 いわゆる、エラーハンドリング/例外ハンドリング関連の内容 ● は含んでおりません。
12.
本日のレシピ 1.例外安全とは? 2.例外安全性の種類 3.例外安全なコードを書くには 4.例外安全にするための技法 ● いわゆる、エラーハンドリング/例外ハンドリング関連の内容 は含んでおりません。 ●
というかそれは僕も知りたいので誰か教えt(ry
13.
1.例外安全とは?
14.
例外安全とは? 「あるコード内を実行中の失敗が、メモリリー ク、格納データの不整合、不正な出力などの有 害な効果を生じないとき、そのコード片は例外 安全であると言う。」 “例外処理” http://ja.wikipedia.org/wiki/%E4%BE%8B %E5%A4%96%E5%87%A6%E7%90%86
15.
例外安全とは? 「例外安全なプログラミングとは、 例外を投げ る可能性があるコードが実際に例外を投げた場 合に、 プログラムの状態が壊れずリソースも リークしないように作るプログラミングのこと を言います。
」 “例外安全なプログラミング” http://www.kmonos.net/alang/d/2.0/exception-safe.html
16.
例外安全とは? ●
例外が発生しても適切に対処できるよう なコードを書く。 ● 適切に対処しないと・・・ ‣ メモリリーク、リソースリーク ‣ 中途半端な操作の完了 ‣ デストラクタから例外が投げられる と・・・
17.
例外安全でないコードの例(1) void SampleClass::ReadData(int n) {
delete [] data_; data_ = new T[n]; read_data(data_, n); }
18.
例外安全でないコードの例(1) void SampleClass::ReadData(int n) {
delete [] data_; data_ = new T[n]; //←ここや read_data(data_, n); }
19.
例外安全でないコードの例(1) void SampleClass::ReadData(int n) {
delete [] data_; data_ = new T[n]; //←ここや read_data(data_, n);//←ここで }
20.
例外安全でないコードの例(1) void SampleClass::ReadData(int n) {
delete [] data_; data_ = new T[n]; //←ここや read_data(data_, n);//←ここで } //例外が投げられると...??
21.
例外安全でないコードの例(1) void SampleClass::ReadData(int n) {
delete [] data_; data_ = new T[n]; //←ここや read_data(data_, n);//←ここで } //例外が投げられると...?? SampleClassの状態が壊れてしまう!!
22.
例外安全でないコードの例(2) SampleClass2 &
SampleClass2::operator= (SampleClass2 const &rhs) { data1_ = rhs.data1_; data2_ = rhs.data2_; data3_ = rhs.data3_; data4_ = rhs.data4_; return *this; }
23.
例外安全でないコードの例(2) SampleClass2 &
SampleClass2::operator= (SampleClass2 const &rhs) { data1_ = rhs.data1_; data2_ = rhs.data2_;//このうち data3_ = rhs.data3_; data4_ = rhs.data4_; return *this; }
24.
例外安全でないコードの例(2) SampleClass2 &
SampleClass2::operator= (SampleClass2 const &rhs) { data1_ = rhs.data1_; data2_ = rhs.data2_;//このうち data3_ = rhs.data3_;//どれかで data4_ = rhs.data4_; return *this; }
25.
例外安全でないコードの例(2) SampleClass2 &
SampleClass2::operator= (SampleClass2 const &rhs) { data1_ = rhs.data1_; data2_ = rhs.data2_;//このうち data3_ = rhs.data3_;//どれかで data4_ = rhs.data4_;//例外が起きたら return *this; }
26.
例外安全でないコードの例(2) SampleClass2 &
SampleClass2::operator= (SampleClass2 const &rhs) { data1_ = rhs.data1_;//これはどうなる? data2_ = rhs.data2_;//このうち data3_ = rhs.data3_;//どれかで data4_ = rhs.data4_;//例外が起きたら return *this; }
27.
例外安全なコードじゃないと
28.
例外が起きたときに きちんと対処できない
29.
よし、
30.
例外安全なコードを書こう!
31.
と、そのまえに
32.
2.例外安全性の種類
33.
例外安全性の種類 ● 例外を投げない保証
高 ● 強い例外安全 例外安全性 ● 基本的な例外安全 ● 例外安全保証なし 低
34.
例外安全性の種類 ● 例外を投げない保証 ●
強い例外安全 但し・・・ ● 基本的な例外安全 ● 例外安全保証なし
35.
例外安全性の種類 ● 例外を投げない保証
高 ● 強い例外安全 コスト… ● 基本的な例外安全 ● 例外安全保証なし 低
36.
例外安全性の種類 ●
例外安全保証なし
37.
例外安全性の種類
● 例外安全保証なし ● その関数や呼び出し先で例外が起きると リソースがリークしてしまうかもしれな い・・・
38.
例外安全性の種類
● 例外安全保証なし void SampleClass::ReadData(int n) { delete [] data_; data_ = new T[n]; read_data(data_, n); }
39.
例外安全性の種類 ●
基本的な例外安全の保証
40.
例外安全性の種類
● 基本的な例外安全の保証 ● 例外が投げられても、いかなるリソース もリークしない。
41.
例外安全性の種類
● 基本的な例外安全の保証 ● 例外が投げられても、いかなるリソース もリークしない。 ● 副作用は出るかもしれない(データの変 更や出力など。)
42.
例外安全性の種類
● 基本的な例外安全の保証 ● 例外が投げられても、いかなるリソース もリークしない。 ● コンテナの中で例外が発生した場合、一 貫性は保っているが、予測可能な状態と は限らない。 ● なのでその後、削除や再利用はできる。
43.
例外安全性の種類
● 基本的な例外安全の保証 void SampleClass::ReadData(int n) { delete [] data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); } catch(...) { delete [] data_; data_ = 0; } }
44.
例外安全性の種類 ●
強い例外安全の保証
45.
例外安全性の種類
● 強い例外安全の保証 ● 例外が起きたなら、全ての変更は ロールバックされる ● 完全な成功か、例外による完全な失 敗かの2つの状況になる
46.
例外安全性の種類
● 強い例外安全の保証 void SampleClass::ReadData(int n) { T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } }
47.
例外安全性の種類 ●
例外を投げない保証(no throw)
48.
例外安全性の種類
● 例外を投げない保証(no throw) ● 操作は全て正しく完了されることが 保証される。
49.
例外安全性の種類
● 例外を投げない保証(no throw) ● 操作は全て正しく完了されることが 保証される。 ● 例)基本データ型の代入などは例外 が起きない
50.
例外安全性の種類
● 例外を投げない保証(no throw) ● 操作は全て正しく完了されることが 保証される。 ● 例)基本データ型の代入などは例外 が起きない ● 呼び出し先も例外を投げない保証が できなければならない
51.
例外安全性の種類 ●
例外を投げない保証(no throw) void foo() { int n1 = 0x10; int n2 = n1; int *pn1 = &n1; int *pn2 = pn1; }
52.
3.例外安全なコードを書くには
53.
例外安全なコードを書くには ●
ある実行パス中の例外安全性は、その工 程で一番低いものになる。
54.
例外安全なコードを書くには ●
ある実行パス中の例外安全性は、その工 程で一番低いものになる。 ● どゆこと?
55.
例外安全なコードを書くには int baz() {
return bar() * bar(); } void foo() { int n1 = 1; //例外安全なコード int n2 = bar(); //例外安全でないコード int n3 = 3; //例外安全なコード int n4 = baz(); //例外安全でないコード }
56.
例外安全なコードを書くには (さっきの「強い例外安全」のサンプルコード) void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } }
57.
例外安全なコードを書くには (さっきの「強い例外安全」のサンプルコード) void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); //←もしこの関数が delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } }
58.
例外安全なコードを書くには (さっきの「強い例外安全」のサンプルコード) void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); //←もしこの関数が delete [] tmp; //例外安全じゃないと } catch(...) { delete [] data_; data_ = tmp; } }
59.
例外安全なコードを書くには (さっきの「強い例外安全」のサンプルコード) void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); //←もしこの関数が delete [] tmp; //例外安全じゃないと } catch(...) { //ReadData関数は delete [] data_; d...//完全な例外安全とは } //言えなくなる }
60.
例外安全なコードを書くには ●
ある実行パス中の例外安全性は、その工 程で一番低いものになる。 ● 呼び出し先の例外安全性にも左右されて しまう。
61.
例外安全なコードを書くには ●
ある実行パス中の例外安全性は、その工 程で一番低いものになる。 ● 呼び出し先の例外安全性にも左右されて しまう。 ● プログラムの中で基本的な機能であるほ ど、しっかりした例外安全性を実装して いなければならない。(コンテナなど)
62.
例外安全なコードを書くには ●
ある実行パス中の例外安全性は、その工 程で一番低いものになる。 ● 呼び出し先の例外安全性にも左右されて しまう。 ● プログラムの中で基本的な機能であるほ ど、しっかりした例外安全性を実装して いなければならない。(コンテナなど) ● 標準のコンテナは大体強い保証を満たす
63.
例外安全なコードを書くには ●
それぞれの関数で例外を投げうる部分と 投げない部分を明確に分離する。 ● 本来の処理の成功を確認した時点で、例 外を投げない部分を使って、状態の変更 と後処理を行うようにする。
64.
例外安全なコードを書くには ●
例外中立について
65.
例外安全なコードを書くには void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } }
66.
例外安全なコードを書くには void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } //例外安全に書けましたね! }
67.
例外安全なコードを書くには void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } //でもいざ例外が起きたときに }
68.
例外安全なコードを書くには void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } //ReadDataの呼び出し元は } //ここで起きた例外をなにも知らない
69.
例外安全なコードを書くには ●
例外中立について ● コンテナなどで例外が起きると、その例 外が起きるまでのコンテキストを知って いるのは呼び出し元だけ。
70.
例外安全なコードを書くには ●
例外中立について ● コンテナなどで例外が起きると、その例 外が起きるまでのコンテキストを知って いるのは呼び出し元だけ。 ● コンテナでは、自分の行った範囲の例外 は安全に処理できるけど、他は無理。
71.
例外安全なコードを書くには ●
例外中立について ● コンテナなどで例外が起きると、その例 外が起きるまでのコンテキストを知って いるのは呼び出し元だけ。 ● コンテナでは、自分の行った範囲の例外 は安全に処理できるけど、他は無理。 ● 適切に処理できるところまでは例外を正 しく伝える。
72.
例外安全なコードを書くには void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } }
73.
例外安全なコードを書くには void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; //正しくはこう。 } }
74.
例外安全なコードを書くには ●
単一の関数にatomicでない複数の処理が あると、例外安全の強い保証をするのは 不可能。 ● 例)std::coutに出力してからstd::cerr に出力
75.
4.例外安全にするための技法
76.
これまでのことは
77.
いまから紹介する 2つのテクニックの
78.
布石に過ぎなかった
79.
布石に過ぎなかった
\ばばーん/
80.
例外安全にするための技法 ●
いままで説明してきたことを上手く実装 するためのテクニック
81.
例外安全にするための技法 ●
いままで説明してきたことを上手く実装 するためのテクニック ● Swap
82.
例外安全にするための技法 ●
いままで説明してきたことを上手く実装 するためのテクニック ● Swap ● RAII(Resource Acquisition Is Initialization)
83.
例外安全にするための技法
● Swap ● 実体を他に作って、全て成功した ら、変更したいリソースとSwapする
84.
例外安全にするための技法
● Swap ● 実体を他に作って、全て成功した ら、変更したいリソースとSwapする ● Swapは、例外を投げない保証を必ず 守る
85.
例外安全にするための技法 template<typename T> void swap(T
&lhs, T &rhs) { T tmp = lhs; lhs = rhs; rhs = tmp; }
86.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //頑張って強い例外安全にしてるけど }
87.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //ロールバック用にいろいろ書いてて }
88.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //例外を投げる部分が }
89.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //例外を投げない部分に囲まれて }
90.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //Try-Catchも入り乱れて }
91.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //ちょっと複雑・・・ }
92.
例外安全なコードを書くには ●
それぞれの関数で例外を投げうる部分と 投げない部分を明確に分離する。 ● 本来の処理の成功を確認した時点で、例 外を投げない部分を使って、状態の変更 と後処理を行うようにする。
93.
例外安全にするための技法
● Swap ● 実体を他に作って、全て成功した ら、変更したいリソースとSwap
94.
例外安全にするための技法
● Swap ● 実体を他に作って、全て成功した ら、変更したいリソースとSwap 例外を投げうる部分 投げない部分
95.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = new T[n]; //先に確保 try { read_data(tmp, n);//そいつで処理 } catch(...) { delete [] tmp; } std::swap(data_, tmp);//終わったら入れ替え delete [] tmp; //後処理 }
96.
例外安全にするための技法
● Swap ● 例外を投げうる部分と投げない部分を明 確に分離 ● 例外を投げる部分が成功したら例外を投 げない部分で状態を変更 ● ロールバック用のTry-Catchは要らなく なる!
97.
例外安全にするための技法
● Swap ● 例外を投げうる部分と投げない部分を明 確に分離 ● 例外を投げる部分が成功したら例外を投 げない部分で状態を変更 ● ロールバック用のTry-Catchは要らなく なる! (リソース管理用のは必要・・・)
98.
例外安全にするための技法
● Swap ● 自作クラスでも、 Copy-Constructableなクラスなら swapを実装する。
99.
例外安全にするための技法 void SampleClass::swap(SampleClass &rhs) {
//標準のswap関数や std::swap(data_, rhs.data_); //それ用のswap関数などで other_data_.swap(rhs.other_data_); }
100.
例外安全にするための技法
● Swap ● 自作クラスでも、 Copy-Constructableなクラスなら swapを実装する。 ● SampleClass (SampleClass const &rhs);
101.
例外安全にするための技法
● Swap ● 自作クラスでも、 Copy-Constructableなクラスなら swapを実装する。 ● 実装すると・・・
102.
例外安全にするための技法
● Swap ● 自作クラスでも、 Copy-Constructableなクラスなら swapを実装する。 ● Assignableなクラスに出来る。 ● SampleClass & operator=(SampleClass const &)
103.
例外安全にするための技法 SampleClass &
SampleClass::operator= (SampleClass const &rhs) { //コピーコンストラクタ SampleClass tmp(rhs); //swap tmp.swap(*this); return *this; }
104.
例外安全にするための技法 SampleClass &
SampleClass::operator= (SampleClass const &rhs) { //コピーコンストラクタ SampleClass tmp(rhs); //swap tmp.swap(*this); さらにまとめて return *this; 書くと }
105.
例外安全にするための技法 SampleClass &
SampleClass::operator= (SampleClass const &rhs) { SampleClass(rhs).swap(*this); return *this; }
106.
例外安全にするための技法 SampleClass &
SampleClass::operator= (SampleClass const &rhs) { SampleClass(rhs).swap(*this); return *this; } メンバ変数がAssignableであることを 要求しない
107.
例外安全にするための技法 SampleClass &
SampleClass::operator= (SampleClass const &rhs) { SampleClass(rhs).swap(*this); return *this; } Copy And Swap
108.
例外安全にするための技法
● RAII ● 「リソースの確保は初期化である」
109.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //リソース管理のためにコードが複雑に }
110.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //deleteも分散してしまった }
111.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } //対応していない }
112.
例外安全にするための技法
● RAII ● 「リソースの確保は初期化である」 ● コンストラクタでリソースを確保 ● デストラクタでリソースを破棄
113.
例外安全にするための技法
● RAII ● 「リソースの確保は初期化である」 ● コンストラクタでリソースを確保 ● デストラクタでリソースを破棄 対応!!
114.
例外安全にするための技法
● RAII class RAIIClass { RAIIClass(Resource r) : r_(r) {} RAIIClass(Args as) : r_(CreateResource(as)) {} ~RAIIClass() { DisposeResource(r_); } private: Resource r_; };
115.
例外安全にするための技法
● RAII ● これをメモリ管理に使ったのがいわ ゆるスマートポインタ
116.
例外安全にするための技法
● RAII ● これをメモリ管理に使ったのがいわ ゆるスマートポインタ ● プログラマはリソース解放のめんど くささから解放される!
117.
例外安全にするための技法
● RAII ● これをメモリ管理に使ったのがいわ ゆるスマートポインタ ● プログラマはリソース解放のめんど くささから解放される! ● 例外安全とか考えなくても使うべ き!
118.
例外安全にするための技法
● RAII ● これがどのように例外安全性の点で 重宝されるのか?
119.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } }
120.
例外安全にするための技法
● RAII ● Deleteのために例外をCatchしなく ちゃいけなかった
121.
例外安全にするための技法
● RAII ● Deleteのために例外をCatchしなく ちゃいけなかった ● でもRAIIなクラスを使うと、Delete は自動化できる
122.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; これが read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; throw; } }
123.
例外安全にするための技法 void SampleClass::ReadData(int n) {
shared_array<T> tmp = data_; try { data_.reset(new T[n]); こうなる read_data(data_, n); } catch (...) { data_ = tmp; } }
124.
例外安全にするための技法
● RAII ● どこで起きるかわからないような例 外によって関数を抜けるときも、そ の時に自動でリソースが解放され る! ● リソース解放のためのTry-Catchは要 らなくなる!
125.
例外安全にするための技法
● RAII ● どこで起きるかわからないような例 外によって関数を抜けるときも、そ の時に自動でリソースが解放され る! ● リソース解放のためのTry-Catchは要 らなくなる!(強い例外安全保証の ためのは必要・・・)
126.
例外安全にするための技法
● SwapとRAII
127.
例外安全にするための技法
● SwapとRAII 1.Swapはロールバック用のTry- Catchを不要にする。
128.
例外安全にするための技法
● SwapとRAII 1.Swapはロールバック用のTry- Catchを不要にする。 2.RAIIはリソース管理用のTry- Catchを不要にする。
129.
例外安全にするための技法
● SwapとRAII 1.Swapはロールバック用のTry- Catchを不要にする。 2.RAIIはリソース管理用のTry- Catchを不要にする。 3.例外中立のために、例外が起き てもいじらないで伝える。
130.
例外安全にするための技法
● SwapとRAII 合体
131.
例外安全にするための技法 void SampleClass::ReadData(int n) {
shared_array<T> tmp(new T[n]); read_data(tmp_, n); std::swap(data_, tmp); }
132.
例外安全にするための技法 void SampleClass::ReadData(int n) {
shared_array<T> tmp(new T[n]); read_data(tmp_, n); std::swap(data_, tmp); } おわかりいただけただろうか
133.
例外安全にするための技法 void SampleClass::ReadData(int n) {
shared_array<T> tmp(new T[n]); read_data(tmp_, n); std::swap(data_, tmp); } おわかりいただけただろうか ではもう一度・・・
134.
例外安全にするための技法 void SampleClass::ReadData(int n) {
T *tmp = data_; data_ = 0; try { data_ = new T[n]; read_data(data_, n); delete [] tmp; } catch(...) { delete [] data_; data_ = tmp; } }
135.
例外安全にするための技法 void SampleClass::ReadData(int n) {
shared_array<T> tmp(new T[n]); read_data(tmp_, n); std::swap(data_, tmp); }
136.
例外安全にするための技法
● SwapとRAII ● 適切なコードを書けば、例外安全 性のためにTry-Catchを書く必要 はない。
137.
例外安全にするための技法 ●
デストラクタで例外
138.
例外安全にするための技法
● デストラクタで例外 ● 禁止!
139.
例外安全にするための技法
● デストラクタで例外 ● 禁止! ● 配列を安全にできない ● 例外が起きたときにスタックの巻 き戻しを安全にできない ● 全ての例外安全の努力が水の泡!
140.
5.まとめ
141.
まとめ ●
例外安全なコードを書くには
142.
まとめ ●
例外安全なコードを書くには ● 例外を投げる部分と投げない部分を 分離して、例外のある処理の成功を 確認してから、状態を変更する。 ● RAIIを使用してリソースの管理を自 動化する
143.
まとめ ●
今回の内容はほとんど全て 「Exceptional C++」 (ハーブ・サッター著) に書かれています ● あと「C++ Coding Standard」も
144.
おしまい。
Download