2016-07-17 4 views
7

カスタムディテクタで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(); 
+1

Deleterが呼び出される前に使用カウンタがゼロになり、[この '期限切れの参照](http://en.cppreference.com/w/cpp/memory/weak_ptr/expired)では、 'use_count()== 0'と同じです。リファレンスは正式なものではなく、最終的な答えを見つけるために仕様を調べる必要があります(C++ 11、C++ 14、およびC++ 17の標準のドラフトはすべて無料で入手できます。十分な)。 –

+0

合意。しかし、標準からの決定的な答えは私が求めているものです。 :-)私はまだ自分のために1つを見つけませんでした。 – jacobsa

+2

あなたの主張が真実でない場合、弱めロック()で置き換え(おそらく所有権を外して)、共有オブジェクトのデストラクタが2回実行されることを暗示しています。 –

答えて

2

明らかにこれを保証するC++ 14標準には何もありません。私は今問題をカバーする標準のdefect reportを開いた。

+0

あなたの不具合報告が更新されました。彼らはこれが欠陥ではないと考えているようです:仲裁人はそのようなことを掘り下げてはいけませんし、それを許容するための実装上の負担は、 –

+0

ええ、私はそれを見ました。正直に言えば、実装の負担とは何かを理解していません。 – jacobsa

8

標準は何も保証しません。 shared_ptrのデストラクタについて、スペックだけ言う:

  • *thisは別のshared_ptrインスタンス(> 1 use_count())と、空や株式所有であれば、副作用がありません。
  • *thisがオブジェクトpと削除者dを所有している場合、d(p)が呼び出されます。
  • その他の場合、*thisはポインタpを所有し、削除pが呼び出されます。

    [注:*thisは、その前よりも1つ少ないuse_count()を報告する*thisと所有権を共有し、すべてのshared_ptrインスタンスを破棄した後*thisの破壊は、いずれかによって、この*と所有権を共有するインスタンスの数を減少させるため値。末端ノート]

そしてresetは、破壊され、一時的にshared_ptrを交換するという観点で定義されています。

この仕様では、デコンターが終了したの後に、use_countの状態が0であることが保証されています。です。そのプロセス中に正確に0に設定されている場合は指定されません。

+1

ありがとう、これは私の問題の理解でもありましたが、あなたはその心を釘付けにしました。:-)私は、(​​std :: shared_ptr )を現在削除されているオブジェクトに復活させることができるので、実装が他のことをするのは非常に危険であるという事実に頼る必要があるでしょう。 – jacobsa

+1

@jacobsa:あなたはそれに関する不具合報告を提出できます。彼らはC++の文言の修正をしているかもしれません。 –

+2

ありがとうございます、私は今、欠陥報告を提出しました。 – jacobsa

関連する問題