
項目 20:不正ポインタになり得る std::shared_ptr ライクなポインタには std::weak_ptr を用いる
|
133
ありません。そのため、配列のインデックス演算にはポインタ算術演算を用いた無骨な式を駆使し
なければなりません。さらに、std::shared_ptr は、単一オブジェクトの場合にのみ意味をなす、
派生クラスポインタから基底クラスポインタへの変換に対応していますが、これを配列に用いると
型システムに風穴を開けることになります(このため、std::unique_ptr<T[]> API ではこの変換
を禁止している)。最も重要な点は、組み込み配列ライクなさまざまな C++11 オブジェクトがありな
がら(std::array、std::vector、std::string など)、単純配列を指すスマートポインタを宣言
するなどは、まず間違いなく悪い設計の
あかし
証 だということです。
重要ポイント
•
std::shared_ptr は、任意の共有リソースのライフタイム管理をガーベジコレクションに近
付ける、有用なものである。
•
std::shared_ptr オブジェクトのサイズは、std::unique_ptr の 2 倍になるのが通例であ
る。また、コントロールブロックに由来するオーバヘッドが発生し、レファレンスカウント
のアトミック演算も必要になる。
•
リソース破棄時にディフォルトで実行されるのは delete だが、カスタムデリータも指定可
能である。デリータの型は