weak_ptrのリセットはshared_ptrに影響しますか?


11

私は使用にあまり慣れておらずweak_ptr、かなり混乱する状況に直面しています。Intel XE 2019 Composer update 5パッケージ2019.5.281)をVisual Studio 2019 ver。組み合わせて使用しています。16.2.5。64ビットでコンパイルします。標準のC ++ 17を使用しています。

これが私のスパイクソリューションのコードです。

#include <memory>
#include <iostream>

using namespace std;

int main( int argc, char* argv[] )
{
    shared_ptr<int> sp = make_shared<int>( 42 );
    cout << "*sp = " << *sp << endl;

    weak_ptr<int> wp = sp;
    cout << "*sp = " << *sp << ", *wp = " << *wp.lock() << endl;

    wp.reset();
    cout << "*sp = " << *sp << endl;

    return 0;
}

私が期待する出力は次のとおりです。

*sp = 42
*sp = 42, *wp = 42
*sp = 42

...しかし、ここに私が得たものがあります:

*sp = 42
*sp = 42, *wp = 42
*sp = -572662307

何が入ってるの?shared_ptr関連付けられた/ weak_ptrがリセットされたときにが変更/無効化されるのは正常ですか?私が得た結果について少し混乱しています。実を言うと、私はこの結果を期待していなかった...

編集1

このバグは64ビット構成で発生しますが、32ビットでは発生しません。この後者の構成では、結果は期待どおりです。

編集2

このバグはDebugでのみ発生します。Releaseをビルドすると、期待どおりの結果が得られます。



2
あなたの実装にはバグがあると思います。 gccは正しい結果を生成します
NathanOliver

1
Visual Studio 2019(v。16.2.5)で再現できない
Frodyne

1
いいえ、これは間違いなく正常ではありません。
気まぐれ

4
デバッグに役立つ場合-572662307 = 0xDDDDDDDD、これは解放されたヒープメモリを示すmsvcの方法です
Eric

回答:


2

Intel ICC側の実際のバグのようです。私はそれを報告しました。

この問題の特定にご協力いただきありがとうございます。


1
回答にバグレポートへのリンクを追加できますか?こうすることで、同じ問題のある人は誰でもそのステータスについてバグレポートを参照できます。
Sander De Dycker

ケースが修正されたら、コメントを追加します。
dom_beau

1
はい、リンクを追加してください。これにより、読者がレポートに独自のコメントを追加できるようになります。
ハーフ

方法はわかりません。リンクにアクセスした場合、それを表示するにはIntelアカウントが必要ですか??? たぶん私は間違っています???教えてください...私はチケットをオープンし、それは私のアカウントにあります。
dom_beau

多分あなたは私がフォーラムで持っている議論に達することができます:C ++コンパイラフォーラム
dom_beau

1

これは、センチネル値を含むデバッグライブラリのバグのようです。前述の行を使用すると、簡単に確認できます。

int i = 1; cout << i << " " << ++i << endl;

出力がでは2 2なくの1 2場合、コンパイラーは準拠しておらず、おそらくそのような場合でもUBと見なされます。この場合、の呼び出しでセンチネル値が誤って使用される可能性がありreset()ます。事前に割り当てられた静的バッファー内に新しい配置によって作成されたオブジェクトを削除する場合も同様です。デバッグモードでは、いくつかの実装によってセンチネル値で上書きされます。


これは、与え1 2両方で、64ビットおよび32ビットデバッグリリース
dom_beau

2
バグは、_Ref_count_base指定されているデフォルトのcTorにあります= default_Uses = 1_Weaks = 1に設定され10いる2つのメンバー。デフォルトで生成されたcTorにバグがあるようです。memoryファイルを参照してください...
dom_beau

@dom_beauまあ、それは我々がC ++での初期化があることを知っても、報告書の価値がある真剣に狂気
金曜日パイ-スウィフト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.