【C++11】コレクションとスマートポインタ
標準ライブラリのスマートポインタには std::unique<T> と std::shared_ptr<T> がある。
また、コレクションには
- vector
- list
- map
- set
などがある。コレクションに格納する型も
- 値(実体)T
- 参照 T&
- 生のポインタ T*
と、上記2種類のスマートポインタがある。
コレクションと型の組み合わせが多岐にわたるが、どういう場合にどんな組み合わせにすべきか、検討して整理したい。
検討結果
生のポインタや生の参照を使うと、メモリ管理を自動化できない。ダングリングポインタや2重開放、メモリリークなどの原因になる。従って、基本的には使わず、スマートポインタを使う。
値を使う場合は、コピーが必要な場合。コンテナとその他で値を共有したい場合はコピーではだめなので、スマートポインタを使う。
スマートポインタの使い分け
コンテナにスマートポインタを格納する場合を考える。
std::unique_ptr<T> を使うのは、コンテナとその他で共有しない(同時に保持しない)場合。コンテナの外でオブジェクトを消去したいようなときには、std::move()を使って、所有権をコンテナから外部に渡す。
std::unique_ptr<T> を使えば、コンテナが消滅するときにオブジェクトが消滅する。
std::shared_ptr<T> を使うと、コンテナとコンテナ外の参照がなくなった時、オブジェクトが消滅する。