कमजोर_प्रति रीसेट साझा_प्रति को प्रभावित करता है?


11

मैं उपयोग करने के लिए बहुत अभ्यस्त नहीं हूं weak_ptrऔर मैं काफी भ्रामक स्थिति का सामना कर रहा हूं। मैं इंटेल XE 2019 कम्पोजर अपडेट 5 ( पैकेज 2019.5.281 ) का उपयोग विजुअल स्टूडियो 2019 वर्जन के साथ कॉम्बिनेशन में कर रहा हूं 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रीसेट किया जाता है तो क्या उसे संशोधित / अमान्य किया जाना सामान्य है? मैं प्राप्त परिणामों के बारे में थोड़ा भ्रमित हूं। सच कहूं तो मुझे इस परिणाम की उम्मीद नहीं थी ...

EDIT 1

जबकि बग 64-बिट कॉन्फ़िगरेशन में होता है , यह 32-बिट में नहीं होता है । इस बाद के विन्यास में, परिणाम वही है जो अपेक्षित है।

EDIT 2

बग केवल डीबग में होता है । जब मैं रिलीज में निर्माण करता हूं , तो मुझे अपेक्षित परिणाम मिलता है।



2
मुझे लगता है कि आपके कार्यान्वयन में एक बग है। gcc सही परिणाम देता है
NathanOliver

1
विजुअल स्टूडियो 2019 (v। 16.2.5) में पुन: पेश नहीं किया जा सकता है
फ्रॉडेन

1
नहीं, यह निश्चित रूप से सामान्य नहीं है।
अजीब

4
मामले में यह डीबग करने में मदद करता है -572662307 = 0xDDDDDDDD, जो कि फ्रीक हीप मेमोरी को इंगित करने का msvc का तरीका है
Eric

जवाबों:


2

ऐसा प्रतीत होता है कि यह इंटेल आईसीसी की तरफ एक वास्तविक बग है; मैंने इसकी सूचना दी है।

फिर से इस समस्या को इंगित करने के लिए मेरी मदद करने के लिए धन्यवाद।


1
क्या आप अपने जवाब में बग रिपोर्ट का लिंक जोड़ सकते हैं? इस तरह, उसी मुद्दे वाले किसी को भी इसकी स्थिति के लिए बग रिपोर्ट को संदर्भित किया जा सकता है।
सैंडर डी डाइकर

मामला तय होते ही मैं एक टिप्पणी जोड़ूंगा।
dom_beau

1
हां कृपया लिंक जोड़ने के लिए - यह पाठकों को रिपोर्ट में अपनी टिप्पणी जोड़ने की अनुमति देगा।
१०

कैसे नहीं देखते। यदि आप लिंक तक पहुँचते हैं, तो आपको इसे देखने के लिए एक इंटेल खाते की आवश्यकता है ??? शायद मैं गलत हूँ??? मुझे बताओ ... मैंने एक टिकट खोला और यह मेरे खाते में है।
dom_beau

हो सकता है कि आप इस चर्चा पर पहुँच सकते हैं कि मैं फोरम में हूँ: C ++ कंपाइलर फोरम
dom_beau

1

यह डिबग लाइब्रेरी में एक बग की तरह दिखता है, जो संतरी मूल्यों के साथ है। मैंने उल्लेख किया लाइन का उपयोग करके यह जांचना आसान है:

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

यदि आउटपुट 2 2इसके बजाय है 1 2, तो कंपाइलर आज्ञाकारी नहीं है और संभवतः अभी भी ऐसे मामले को यूबी मानता है। इस कॉल में सेंटिनल वैल्यू का गलत तरीके से इस्तेमाल किया जा सकता है reset()। इसी तरह की बात उपदेशित स्थैतिक बफर के भीतर प्लेसमेंट नए द्वारा बनाई गई वस्तु को हटाने के साथ होती है, डिबग मोड में यह प्रहरी मूल्यों के साथ कुछ कार्यान्वयनों द्वारा अधिलेखित हो जाता है।


यह 64-बिट और 32-बिट , डीबग और रिलीज़1 2 दोनों में देता है ।
डोम_ब्यू

2
बग _Ref_count_baseडिफ़ॉल्ट cTor में है जो निर्दिष्ट है = default। दो सदस्यों _Uses = 1और _Weaks = 1की तैयारी में हैं 1और 0क्रमशः। ऐसा लगता है कि डिफ़ॉल्ट जनरेट किए गए cTor को बग किया गया है। memoryफाइल देखें ...
dom_beau

@dom_beau अच्छी तरह से, यह एक रिपोर्ट के लायक है, हम यह भी जानते हैं कि C ++ में प्रारंभिक रूप से गंभीर रूप से बोनस है
स्विफ्ट - शुक्रवार पाई
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.