तो यह है स्थिति:

vector <string>::iterator * it;
{
    vector <string> v{"asd", "asd"};
    auto iter = v.begin();
    it = new vector <string>::iterator(iter);
}
(**it) = string("asd");

अब, मुझे वेब पर ऐसा कोई संसाधन नहीं मिल रहा है जो मुझे बताए कि यह यूबी है या वैध कोड है।

मेरा प्रश्न यह है:
जब मैं एक पुनरावर्तक बनाता हूं, यदि उस इटरेटर के पास कंटेनर से आजीवन लंबा जीवन है, तो अपरिभाषित व्यवहार है या मानक में कहीं परिभाषित किया गया है?

2
Berto99 13 अप्रैल 2020, 23:02

1 उत्तर

सबसे बढ़िया उत्तर

आपके पोस्ट किए गए कोड में,

(**it) = string("asd");

अपरिभाषित व्यवहार का कारण बनता है।

*iter एक पुनरावर्तक है लेकिन संबंधित vector उस समय तक जीवित नहीं है जब तक आप उस रेखा तक नहीं पहुंचते। इसलिए, **iter डेरेफेरेंसिंग डैंगलिंग पॉइंटर के समान है। BTW, यदि आप iterator* के बजाय केवल iterator का उपयोग करते हैं तो यह नहीं बदलता है।

निम्न कोड भी अपरिभाषित व्यवहार का कारण बनता है।

vector <string>::iterator it;
{
    vector <string> v{"asd", "asd"};
    auto iter = v.begin();
    it = iter;
}
(*it) = string("asd");
2
R Sahu 13 अप्रैल 2020, 20:14