2012-06-18 8 views
5

私は以下のことを行う必要があると仮定します(これはC++標準の議論のための想像力のあるコードなので、私はなぜこのように設計するのか議論しませんので、間違っている。)同じアドレス、複数のshared_ptrカウンタは、C++標準によって禁止されていますか?

T* ptr = new T; 
shared_ptr<T> p(ptr); 
shared_ptr<T> q(ptr, SomeDeleterThatDoesnotDeleteButDoSomeOtherStuff()); 

ので、実質的に何の問題がないだろう、ロジックはそのコピーのpまたは一部が長いqのすべてのコピーよりも住んでいることを保証したとします。私の質問は、C++標準では禁止されているかどうかです。同じアドレスを共有する異なるshared_ptrカウンタのために、C++標準で明示的にUBと記述されていますか?

ありがとうございました。

+1

あなたが 'return q;'ならば? –

+0

@Peterそれは、ノン・デリターを呼び出すために、リファレンスのいくつかのサブセットが空になっているという知識に役立つ何かをするというアイデアだと思います。 – Potatoswatter

+0

そのデザインはその目的のためにひどいものではありません。カスタムデリターを*削除*したものに置き換えることで、適切な破壊を保証することができます。また、自身の 'shared_ptr'を所有しています。1.デストラクターでアクションを実行するダミーオブジェクトに、または2.アクションを実行する別のカスタムdeleter 。しかし、これらの方法は、q個のオブジェクトの集合が適切な所有者のセット「p」に対して急速に変化する場合、効率が悪くなる可能性がある。 – Potatoswatter

答えて

2

私は、特にそれを排除する標準(よく、最終草案)で何も見つけることができません。一見同等の表現 のshared_ptr(static_castを(r.getは()))結局 未定義の動作になります、同じオブジェクトを削除しよう:私は見つけることができる最も近い[注20.9.11.2.10 shared_ptr casts

5にノートあります二度。 -end 注]

実際にカスタムディレクターであなたのケースを忘れてしまったようです。

5

最初のshared_ptrオブジェクトが破棄された場合、2番目のshared_ptrオブジェクトが解放されたオブジェクトにアクセスする可能性があるため、UBを取得します。

あなたの最初のshared_ptrオブジェクトが2番目のshared_ptrオブジェクトより長く存続することを確認したので、UBを取得しません。

関連する問題