読者です 読者をやめる 読者になる 読者になる

shared_ptrとunique_ptr(カスタムデリータの指定)

C++

unique_ptrやshared_ptrは、カスタムデリータを指定できるようになっています。

たとえば次のような場合、deleteの処理では十分ではありません。(「C++なんだからfstreamの…」っていう突っ込みは無し)

std::unique_ptr< FILE > filePtr( fopen(...) ); // fclose()が呼び出されない!



そんなときにカスタムデリータを指定することで解決できます。
カスタムデリータはunique_ptrとshared_ptrで少し異なっているようです。
まずshared_ptrは

std::shared_ptr< FILE > filePtr( fopen(...), fclose );


のように、コンストラクタの第2引数で関数を指定するだけでよいです。

一方unique_ptrはテンプレート引数でカスタムデリータの型を指定する必要があります。

std::unique_ptr< FILE, decltype(&fclose) > filePtr( fopen(...), fclose );



unique_ptrの場合でもカスタムデリータの型はdecltypeを使えば簡単にわかるので、それほど苦にはならないかもしれません。

注意点はいろいろあるようですが、調べてみたところ次のブログなどが参考になりそうでした。(ちなみに私も参考にさせていただきました)


毎月25個ブログの記事を書いていたんですが、今月は無理かもしれないですね。さすがに大学4年の終わりは大変です。結局Qtについてもあまり進んでいないのでまだまだ気は抜けなさそうです。

広告を非表示にする