カスタムディテクタでstd::shared_ptr<Foo>
を使用している場合、関連付けられたすべてのウィークポインタがディテクタによって期限切れになっていることが保証されていますか? (標準で関連するセクションを挙げることができれば非常に感謝します)std :: shared_ptr deleterが実行されるまでに弱いポインタが期限切れになることは保証されていますか?
言い換えれば、以下のアサーションは発射されないことが保証されていますか?
std::weak_ptr<Foo> weak;
std::shared_ptr<Foo> strong{
new Foo,
[&weak] (Foo* f) {
assert(weak.expired());
delete f;
},
};
weak = strong;
strong.reset();
Deleterが呼び出される前に使用カウンタがゼロになり、[この '期限切れの参照](http://en.cppreference.com/w/cpp/memory/weak_ptr/expired)では、 'use_count()== 0'と同じです。リファレンスは正式なものではなく、最終的な答えを見つけるために仕様を調べる必要があります(C++ 11、C++ 14、およびC++ 17の標準のドラフトはすべて無料で入手できます。十分な)。 –
合意。しかし、標準からの決定的な答えは私が求めているものです。 :-)私はまだ自分のために1つを見つけませんでした。 – jacobsa
あなたの主張が真実でない場合、弱めロック()で置き換え(おそらく所有権を外して)、共有オブジェクトのデストラクタが2回実行されることを暗示しています。 –