by shigemk2

当面は技術的なことしか書かない

unique_ptrにポインタ以外のものを持たせる時 #kbkz_tech

kbkz.connpass.com

スコープを抜けたら自動でdelete

unique_ptrは便利

リソースを自動で解放 デリータも設定できる

f:id:shigemk2:20150517193704p:plain

リソースハンドルがポインタでなくてもよいのでは?

GTUのメモリバッファのハンドルとかソケットとかコモンオブジェクトとか

f:id:shigemk2:20150517193806p:plain

ハンドルをリリースしないといけないが、単に置き換えただけではコンパイルできない。

デリータの中でpointer型を指定

f:id:shigemk2:20150517193902p:plain

intとnullptrの比較が出来ずエラーに。。

でもどうしようもない…

しょうがないのでユニークポインタを使うのをあきらめて自分で型を書く。

めんどう。

  • 例外安全性
  • ムーブ
  • リソース漏れ
  • ハンドルごとに毎回書かないといけないのか…

  • 任意の型のリソースハンドルに

  • スコープを抜けたら自動で指定したデリータを実行してくれて
  • ムーブできて

unique_resource

  • 次期標準ライブラリに備えたやつ
  • いつつかえるようになるの? N4189にサンプル実装あるからコピペすればつかえる
  • N4189のunique_resourceは、C++14コンパイラで使えたりする

まとめ

  • unique_ptrはデリータをカスタマイズできるが、ポインタ型のハンドルしかもてない
  • unique_resourceが非ポインタ型ハンドルの自動リソース管理のために提案されている
  • N4189からコピペしたら使える

effective modern C++ Item37

リファレンスコードを積極的にGitHubにあげてて、規格書もTexで書かれていたりする

デリータとしてラムダを渡すだけで良い。

C++14だと生のポインタを使う必要がなくって、newもdeleteも必要なくなってきている。