6

次のことを行う必要があるとします(これはC ++標準について説明するための想像上のコードです。したがって、なぜこのように設計するのかについては説明しません。次のようなことで気にしないでください。設計が間違っている。)

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

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

ありがとう。

4

2 に答える 2

5

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

最初のshared_ptrオブジェクトが2番目のオブジェクトよりも長持ちすることを確認したため、UBは取得されません。

于 2012-06-18T09:11:59.773 に答える
2

標準(まあ、最終ドラフト)には、それを明確に除外するものは何も見つかりません。私が見つけることができる最も近いものはのメモです20.9.11.2.10 shared_ptr casts

5 [注:一見同等の式shared_ptr(static_cast(r.get()))は、最終的に未定義の動作を引き起こし、同じオブジェクトを2回削除しようとします。—エンドノート]

これは実際には、カスタム削除機能を使用した場合のことを忘れているようです。

于 2012-06-18T09:37:06.100 に答える