C++1z shared_ptr::use_count()の仕様を明確化し、unique()を非推奨化

std::shared_ptrクラスのメンバ関数use_count()unique()は参照カウンタがいくつあるか (リソースを共有しているユーザーが何人いるか) を返すもので、デバッグ目的にしか使用しません。また、複数スレッドから使用するには、仕様が不明確でした。

use_count()は引き続きデバッグ目的の機能として残り、複数スレッドからのアクセスについて、仕様が明確化されます。現在の多くの実装が、同期しない読み込み (relaxed load) になっていたこともあり、use_count()は仕様でも「同期しない」ことが明確化されます。そのため、複数スレッドからこのメンバ関数を使用する場合、戻り値で返される参照カウンタは「おおよその値」と見なし、ヒントとして扱うことになります。

unique()メンバ関数の方は非推奨になります。この関数はuse_count() == 1の結果のbool値を返すものです。これが非推奨になるのは、use_count()が複数スレッドからのアクセスに対して同期せず、「おおよその値」しか返さないことで、unique()メンバ関数の戻り値の信頼性が高くないことが理由であると考えられます。

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。