【C++11】コレクションとスマートポインタ

標準ライブラリのスマートポインタには std::unique<T> と std::shared_ptr<T> がある。

また、コレクションには

などがある。コレクションに格納する型も

  • 値(実体)T
  • 参照 T&
  • 生のポインタ T*

と、上記2種類のスマートポインタがある。

コレクションと型の組み合わせが多岐にわたるが、どういう場合にどんな組み合わせにすべきか、検討して整理したい。

 

 検討結果

生のポインタや生の参照を使うと、メモリ管理を自動化できない。ダングリングポインタや2重開放、メモリリークなどの原因になる。従って、基本的には使わず、スマートポインタを使う。

 

値を使う場合は、コピーが必要な場合。コンテナとその他で値を共有したい場合はコピーではだめなので、スマートポインタを使う。

スマートポインタの使い分け

コンテナにスマートポインタを格納する場合を考える。

std::unique_ptr<T> を使うのは、コンテナとその他で共有しない(同時に保持しない)場合。コンテナの外でオブジェクトを消去したいようなときには、std::move()を使って、所有権をコンテナから外部に渡す。

std::unique_ptr<T> を使えば、コンテナが消滅するときにオブジェクトが消滅する。

 

std::shared_ptr<T> を使うと、コンテナとコンテナ外の参照がなくなった時、オブジェクトが消滅する。