SlideShare uma empresa Scribd logo
1 de 46
unique_ptr の紹介 krustf ( @krustf )
自己紹介 XAudio2 普及委員会メンバ(会員2名) 第1回では XAudio2 について発表 大学ではゲーム製作サークルで活動中 現在 C++0x のお勉強中 Lua 始めました 2010/8/29 unique_ptr の紹介 1
こんな人が創った C++ 言語 2010/8/29 unique_ptr の紹介 2
C++0x って? 今年 FCD が承認された C++ の新標準規格 現行の規格とほぼ100%の互換性を持つ GCC ( GNU Compiler Collection )Microsoft Visual C++などがすでに対応を始めている 2010/8/29 unique_ptr の紹介 3
諸注意 これから話す内容は現段階で全コンパイラがサポートできていない場合があります C++ のバージョン比較の定義 現行のバージョン	: C++03 新規格			: C++0x 2010/8/29 unique_ptr の紹介 4
生ポインタを直接とか(笑) 2010/8/29 unique_ptr の紹介 5 えーマジ 生ポインタ? 生ポインタが許されるのは小学生までだよねー
バグの温床になりやすい new したものを手動で delete とか new したインスタンスを直接返すとか 生ポインタを扱う事によるうっかりミスのバグがどれだけあるか 2010/8/29 unique_ptr の紹介 6
2010/8/29 unique_ptr の紹介 7 スマートポインタを使おう!
スマートポインタとは 賢い(Smart な)ポインタ 動的確保されたメモリを自動的に deleteしてくれる(リソースを自動解放してくれる)ようなクラス 宣言は違うが使い方はポインタそのもの 2010/8/29 unique_ptr の紹介 8
std::unique_ptr C++0x で追加されたスマートポインタ copy は不可能 rvalue reference と move semantics を使ったポインタの「所有権の移動」が可能 2010/8/29 unique_ptr の紹介 9
2010/8/29 unique_ptr の紹介 10 (゚Д゚)ハァ?
rvalue reference?move semantics?
rvalue reference 式の右側にあるものを rvalue と呼ぶ 関数の戻り値などの「一時的で無名なデータ」である rvalue への「参照」 「一時的」なら壊しても構わないはず 2010/8/29 unique_ptr の紹介 12
move semantics 一時オブジェクトをコピーせずにポインタを移動しようという考え方 rvalue として受け取ったものをコピーするのではなく移動(move)させる C++03 では auto_ptr が有名 2010/8/29 unique_ptr の紹介 13
早速使ってみる 2010/8/29 unique_ptr の紹介 14 #include <memory> std::unique_ptr< int >     ptr( new int(5) ); if(  ptr  ) { 	std::cout << *ptr << std::endl; } // スコープの末尾で自動的に delete を呼ぶ
配列も使える 2010/8/29 unique_ptr の紹介 15 #include <memory> std::unique_ptr< int[] >     ptr( new int[5] ); for( int i = 0 ; i < 5 ; ++i ) { 	ptr[ i ] = i; } // delete [] がしっかり呼ばれる
2010/8/29 unique_ptr の紹介 16 (・3・)アルェー?
なんで? new	- >	   delete new []	- >	   delete [] どうやって区別してるの..... 2010/8/29 unique_ptr の紹介 17
デリータ指定が可能 unique_ptr にはデリータクラス(オブジェクトを削除担当者)がテンプレート第2引数に指定可能 default_delete<T> がデフォルトで指定 2010/8/29 unique_ptr の紹介 18
std::default_delete 2010/8/29 unique_ptr の紹介 19 namespace std { 	template< class T >	// 通常 struct  default_delete { 		void operator()( T* ptr ) const { delete ptr; }; 	}; 	template< class T >	// 配列 struct  default_delete< T[] > { 		void operator()( T* ptr ) const { delete [] ptr; }; 	}; } // namespace std;
デリータの指定方法 関数オブジェクト default_delete の特殊化 関数を渡す(ちょっと面倒) 2010/8/29 unique_ptr の紹介 20 詳細な解説ははてなで記事書いてたのでこっち http://d.hatena.ne.jp/krustf/20100827/1282915158
2010/8/29 unique_ptr の紹介 21 アプローチ方法がアレなので
質問形式で幾つか
Q.元からポインタだったら?
特殊ケース(例. HANDLE 型) typedef  void*  HANDLE;といった通常使う型が元々ポインタだったら? 2010/8/29 unique_ptr の紹介 24 std::unique_ptr< HANDLE, handle_deleter > 	ptr(  CreateEvent( NULL, FALSE, FALSE, NULL )  ); #=> Error! 'コンストラクタのインスタンスと引数が一致しません'
A.型からポインタを消せば良いじゃない
型からポインタを消す std::remove_pointer を使う 2010/8/29 unique_ptr の紹介 26 std::unique_ptr< std::remove_pointer<HANDLE>::type 		   , ... >   ptr( ... ); ↓ std::unique_ptr< void, ... >	  ptr( ... );
Q. 関数の戻り値にできる?
unique_ptr で返却したい 生ポインタで返すのは嫌 2010/8/29 unique_ptr の紹介 28 hoge*  create_instance(); hoge*  ptr = create_instance(); delete  ptr;	// 手動解放とか.... 		// 解放しわすれでリークとか....
A. 可能です
関数の戻り値には move が働く 2010/8/29 unique_ptr の紹介 30 std::unique_ptr<hoge>  create_instance(); std::unique_ptr<hoge>  ptr = create_instance(); 	// 自動的に move が働いてポインタが移動される ptr->func(); // 自動的に削除,  delete ptr; なんて書かなくて済む
Q.unique_ptr の型が面倒だったら?
ややこしい..... 2010/8/29 unique_ptr の紹介 32 std::unique_ptr< 	std::remove_pointer<LPDIRECT3DDEVICE9>::type 	, com_deleter<LPDIRECT3DDEVICE9> >    create_device(); std::unique_ptr< 	std::remove_pointer<LPDIRECT3DDEVICE9>::type 	, com_deleter<LPDIRECT3DDEVICE9> >   ptr  =  create_device();
A.auto を使おう!
auto C++03 では局所変数についての明確な宣言 コンパイラが知っているので関数の戻り値や初期化値で推論してもらう 2010/8/29 unique_ptr の紹介 34 std::vector<int>  arr; // it は std::vector<int>::iterator と推論 auto  it = arr.begin();
戻り値がややこしい時は auto 2010/8/29 unique_ptr の紹介 35 std::unique_ptr< 	std::remove_pointer<LPDIRECT3DDEVICE9>::type 	, com_deleter<LPDIRECT3DDEVICE9> >    create_device(); auto  device  = create_device(); device->Present( NULL, NULL, NULL, NULL );
結論
unique_ptr おいしいです boost.scoped_ptr デリータ指定できないし, move できない shared_ptr デリータ指定できるけどコスト的にどうなの? unique_ptr の使い道を考えると候補から外す std::auto_ptr C++0x から deprecated(廃止予定)になった 2010/8/29 unique_ptr の紹介 37
積極的に使おう unique_ptr でメモリの手動解放をなくそう 2010/8/29 unique_ptr の紹介 38
auto_ptr にはご退場願います
今までありがとうございました 2010/8/29 unique_ptr の紹介 40 auto_ptr auto_ptr
auto_ptr さようなら! ご清聴ありがとうございました
2010/8/29 unique_ptr の紹介 42 宣伝
祝:プログラミングの魔道書発売! 2010/8/29 unique_ptr の紹介 43 © 株式会社ロングゲート
2010/8/29 unique_ptr の紹介 44 © 株式会社ロングゲート
2010/8/29 unique_ptr の紹介 45 © 株式会社ロングゲート

Mais conteúdo relacionado

Mais procurados

Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.kiki utagawa
 
C++入門?
C++入門?C++入門?
C++入門?tsudaa
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門natrium11321
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発Takuya Ueda
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesShintarou Okada
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)信之 岩永
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型信之 岩永
 
boost::shared_ptr tutorial
boost::shared_ptr tutorialboost::shared_ptr tutorial
boost::shared_ptr tutorialNU_Pan
 
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)Cryolite
 
最新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
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golfNomura Yusuke
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性Hibiki Yamashiro
 
C言語の宣言読み方講座
C言語の宣言読み方講座C言語の宣言読み方講座
C言語の宣言読み方講座tetra_cat
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するkwatch
 
エキスパートGo
エキスパートGoエキスパートGo
エキスパートGoTakuya Ueda
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarrayRyosuke839
 

Mais procurados (18)

Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
Pythonの処理系はどのように実装され,どのように動いているのか? 我々はその実態を調査すべくアマゾンへと飛んだ.
 
C++入門?
C++入門?C++入門?
C++入門?
 
競技プログラミングのためのC++入門
競技プログラミングのためのC++入門競技プログラミングのためのC++入門
競技プログラミングのためのC++入門
 
静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発静的解析を使った開発ツールの開発
静的解析を使った開発ツールの開発
 
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core GuidelinesBoost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
C# 8.0 null許容参照型
C# 8.0 null許容参照型C# 8.0 null許容参照型
C# 8.0 null許容参照型
 
boost::shared_ptr tutorial
boost::shared_ptr tutorialboost::shared_ptr tutorial
boost::shared_ptr tutorial
 
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)shared_ptr & weak_ptr (ppt 第2版, DL 専用)
shared_ptr & weak_ptr (ppt 第2版, DL 専用)
 
最新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月)
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
core dumpでcode golf
core dumpでcode golfcore dumpでcode golf
core dumpでcode golf
 
競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性競技プログラミングにおけるコードの書き方とその利便性
競技プログラミングにおけるコードの書き方とその利便性
 
C言語の宣言読み方講座
C言語の宣言読み方講座C言語の宣言読み方講座
C言語の宣言読み方講座
 
PHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較するPHPとJavaScriptにおけるオブジェクト指向を比較する
PHPとJavaScriptにおけるオブジェクト指向を比較する
 
C++0x総復習
C++0x総復習C++0x総復習
C++0x総復習
 
エキスパートGo
エキスパートGoエキスパートGo
エキスパートGo
 
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
 

Semelhante a Unique ptr の紹介

C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)Akira Takahashi
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくばHirotaka Kawata
 
センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。yjono Seino
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCYoshifumi Kawai
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61TATSUYA HAYAMIZU
 
Tensor flow勉強会3
Tensor flow勉強会3Tensor flow勉強会3
Tensor flow勉強会3tak9029
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#信之 岩永
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangYoshiki Shibukawa
 
L-1グランプリ "D言語"
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"det coder
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALegtra
 
Why did I become a ruby committer
Why did I become a ruby committerWhy did I become a ruby committer
Why did I become a ruby committerMasaya TARUI
 
D言語にまだ入っていない新機能 (Dの日#2)
D言語にまだ入っていない新機能 (Dの日#2)D言語にまだ入っていない新機能 (Dの日#2)
D言語にまだ入っていない新機能 (Dの日#2)tom-tan
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstreamwata2ki
 
130522 rt講習会(説明用)
130522 rt講習会(説明用)130522 rt講習会(説明用)
130522 rt講習会(説明用)openrtm
 

Semelhante a Unique ptr の紹介 (15)

C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)C++0xの概要(デブサミ2010)
C++0xの概要(デブサミ2010)
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
 
センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。センパイ!このプログラムクラッシュするんですけど。。。
センパイ!このプログラムクラッシュするんですけど。。。
 
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPCZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
ZeroFormatter/MagicOnion - Fastest C# Serializer/gRPC based C# RPC
 
わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61わんくま同盟大阪勉強会#61
わんくま同盟大阪勉強会#61
 
Tensor flow勉強会3
Tensor flow勉強会3Tensor flow勉強会3
Tensor flow勉強会3
 
.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#.NET Core 2.x 時代の C#
.NET Core 2.x 時代の C#
 
FINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolangFINAL FANTASY Record Keeperを支えたGolang
FINAL FANTASY Record Keeperを支えたGolang
 
L-1グランプリ "D言語"
L-1グランプリ "D言語"L-1グランプリ "D言語"
L-1グランプリ "D言語"
 
Visual C++コード分析を支えるSAL
Visual C++コード分析を支えるSALVisual C++コード分析を支えるSAL
Visual C++コード分析を支えるSAL
 
Why did I become a ruby committer
Why did I become a ruby committerWhy did I become a ruby committer
Why did I become a ruby committer
 
D言語にまだ入っていない新機能 (Dの日#2)
D言語にまだ入っていない新機能 (Dの日#2)D言語にまだ入っていない新機能 (Dの日#2)
D言語にまだ入っていない新機能 (Dの日#2)
 
Linux kernelのbspとupstream
Linux kernelのbspとupstreamLinux kernelのbspとupstream
Linux kernelのbspとupstream
 
130522 rt講習会(説明用)
130522 rt講習会(説明用)130522 rt講習会(説明用)
130522 rt講習会(説明用)
 

Mais de Daisuke Nikura

マルチプラットフォーム開発導入
マルチプラットフォーム開発導入マルチプラットフォーム開発導入
マルチプラットフォーム開発導入Daisuke Nikura
 
Androidやりませんか
AndroidやりませんかAndroidやりませんか
AndroidやりませんかDaisuke Nikura
 
DXライブラリのすゝめ
DXライブラリのすゝめDXライブラリのすゝめ
DXライブラリのすゝめDaisuke Nikura
 
Roombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみたRoombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみたDaisuke Nikura
 
TwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わりますTwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わりますDaisuke Nikura
 
今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?Daisuke Nikura
 

Mais de Daisuke Nikura (10)

マルチプラットフォーム開発導入
マルチプラットフォーム開発導入マルチプラットフォーム開発導入
マルチプラットフォーム開発導入
 
Androidやりませんか
AndroidやりませんかAndroidやりませんか
Androidやりませんか
 
DXライブラリのすゝめ
DXライブラリのすゝめDXライブラリのすゝめ
DXライブラリのすゝめ
 
Roombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみたRoombaを鉄騎コントローラーで操縦してみた
Roombaを鉄騎コントローラーで操縦してみた
 
勉強会を開こう
勉強会を開こう勉強会を開こう
勉強会を開こう
 
Midiやろうよ
MidiやろうよMidiやろうよ
Midiやろうよ
 
TwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わりますTwitterのBasic認証が今度こそ終わります
TwitterのBasic認証が今度こそ終わります
 
diff template library
diff template librarydiff template library
diff template library
 
Big america
Big americaBig america
Big america
 
今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?今話題の3Dの理屈を知ってみる?
今話題の3Dの理屈を知ってみる?
 

Unique ptr の紹介