3

データのバッファを渡すコードがあります。これらのバッファの有効期間を管理し、使用が完了する前にメモリが解放されないようにしたいと考えています。私はそれstd::shared_ptrがこの仕事に適していることを理解しています。私がやりたいことの 1 つは、バッファー全体の所有権情報を維持しながら、バッファーの一部を関数に渡すことです (たとえば、ヘッダーを切り取り、本体を別の関数に渡します)。

std::shared_ptr次のコンストラクタがあることに気付きました:

template< class Y >
shared_ptr( const shared_ptr<Y>& r, T *ptr );

shared_ptrこのコンストラクターを使用すると、所有権を共有するrがポインターを格納する new を作成できますptr。これは素晴らしいことですが、これにより参照カウントが増加します。場合によっては、a を保持せずにバッファーの一部を渡したいことがありshared_ptrます。そのような場合、参照カウントを増やす必要はありません。次のコンストラクタが必要なようです。

template< class Y >
shared_ptr( shared_ptr<Y>&& r, T *ptr );

rは右辺値参照であることに注意してください。のようなコンストラクタが存在するようには見えませんstd::shared_ptr。これには理由がありますか?参照カウントを増やさずにやりたいことをする方法はありますか?

4

1 に答える 1

1

存在しないかもしれませんが、心配する理由はほとんどありません。

確かに、共有ポインタをコピーすると参照カウントがインクリメントされますが、一方、共有ポインタを破棄するとデクリメントされます。したがって:

std::shared_ptr<T> some_pointer = /**/;

std::shared_ptr<R> another_pointer(some_pointer, some_pointer->field());

some_pointer.reset();

移動と意味的に同一であり、さらにいくつかの命令を生成するだけです (最適化されていない場合)。

于 2013-08-14T17:41:33.847 に答える