C++ Academy · पाठ

संदर्भ का lifetime और dangling संदर्भ

वस्तुओं के lifetime पर सावधानी से विचार करके dangling संदर्भों से बचें।

पाठ 4, कुल 4 में से13 चरण

संदर्भ का lifetime और dangling संदर्भ, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

लटकता हुआ संदर्भ क्या है

जब संदर्भित ऑब्जेक्ट नष्ट हो जाता है, तब संदर्भ लटकता हुआ बन जाता है। इसका उपयोग करना अपरिभाषित व्यवहार है—कुछ भी हो सकता है।

क्लासिक उदाहरण

स्थानीय चर का संदर्भ लौटाना। फ़ंक्शन के लौटते ही स्थानीय चर समाप्त हो जाता है; कॉल करने वाले के पास समाप्त मेमोरी का संदर्भ रह जाता है।

// BUG
int& bad() {
    int x = 10;
    return x;       // x dies here
}

int& r = bad();
std::cout << r;     // UB

कंटेनर तत्वों के संदर्भ

यदि std::vector का पुनः-आवंटन होता है, तो उसके किसी तत्व का संदर्भ लटकता हुआ बन जाता है। तत्व जोड़ने पर पूरा संग्रहण स्थानांतरित हो सकता है।

std::vector<int> v = {1, 2, 3};
int& r = v[0];
v.push_back(99);    // may reallocate
std::cout << r;     // possibly UB

Maps और Lists के संदर्भ

कुछ कंटेनर (std::list, std::map, प्रभावित न होने वाले नोड्स के लिए std::unordered_map) स्थिर इटरेटर और संदर्भ देते हैं। std::vector और std::deque ऐसा नहीं करते।

अस्थायी ऑब्जेक्ट के जीवनकाल के नियम

Const संदर्भ किसी अस्थायी ऑब्जेक्ट का जीवनकाल बढ़ा देता है—लेकिन वह संदर्भ लौटाने वाला फ़ंक्शन इसे आगे नहीं बढ़ाता।

// Subtle BUG
const std::string& f() {
    return std::string("temp"); // dies at return
}

const std::string& s = f();      // dangling

if-init कथनों में जीवनकाल (C++17)

C++17 के if/switch init कथनों में मौजूद चर if/switch के बॉडी तक जीवित रहते हैं—यह उपयोगी है, लेकिन कार्य-क्षेत्र का ध्यान रखें।

if (const auto& it = map.find(k); it != map.end()) {
    use(it->second);
}
// `it` is dead here

वर्गों में संदर्भ सदस्य

संदर्भ को वर्ग सदस्य के रूप में संग्रहीत करने पर वर्ग का जीवनकाल संदर्भित ऑब्जेक्ट से बंध जाता है। वर्ग कभी भी संदर्भित ऑब्जेक्ट से अधिक समय तक जीवित नहीं रह सकता। इसका उपयोग केवल तब करें जब स्वामित्व का अर्थ ऐसा माँगता हो।

वैकल्पिक स्वामित्व के लिए Pointer बनाम संदर्भ

संदर्भ null नहीं हो सकता, लेकिन यदि संदर्भित ऑब्जेक्ट समाप्त हो जाए तो संदर्भ टूट जाता है। वैकल्पिक या संभावित रूप से लटकते हुए मामलों को pointer अधिक स्पष्ट रूप से व्यक्त कर सकते हैं।

इसके बजाय स्मार्ट Pointers

साझा स्वामित्व के लिए std::shared_ptr का उपयोग करें। जब तक कम-से-कम एक shared_ptr मौजूद रहता है, pointer ऑब्जेक्ट को जीवित रखता है। इसे स्मार्ट pointer पाठ्यक्रम में शामिल किया गया है।

कंपाइलर की सहायता: lifetimebound

आधुनिक कंपाइलर (क्लैंग, GCC) कुछ लटकते हुए संदर्भ पैटर्न के लिए चेतावनियाँ देते हैं। उपलब्ध होने पर -Wdangling-reference सक्षम करें।

सामान्य तरीका: View प्रकार

std::string_view और std::span बिना-स्वामित्व वाले दृश्य हैं। इनके जीवनकाल संबंधी सरोकार संदर्भों जैसे ही हैं—और इनके लिए भी उतनी ही सावधानी आवश्यक है।

त्वरित जाँच

कौन-सा संचालन किसी std::vector के तत्वों के संदर्भों को अमान्य कर सकता है?

पुनरावलोकन

संदर्भ किसी चीज़ का जीवनकाल नहीं बढ़ाते और न ही उसका स्वामित्व लेते हैं—वे किसी मौजूदा ऑब्जेक्ट का उपनाम होते हैं। यदि ऑब्जेक्ट पहले समाप्त हो जाए, तो वे लटकते हुए बन जाते हैं। स्थानीय संदर्भ लौटाने, कंटेनरों का पुनः-आवंटन करने और बचे हुए अस्थायी ऑब्जेक्ट से सावधान रहें।

शुरुआत निःशुल्क

एआई शिक्षक के साथ C++ सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “संदर्भ का lifetime और dangling संदर्भ” पाठ निःशुल्क है?

हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “संदर्भ का lifetime और dangling संदर्भ” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“संदर्भ का lifetime और dangling संदर्भ” में मैं क्या सीखूँगा?

वस्तुओं के lifetime पर सावधानी से विचार करके dangling संदर्भों से बचें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“संदर्भ का lifetime और dangling संदर्भ” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. संदर्भ: चर के उपनाम क्यों
  2. मान द्वारा पास करना बनाम संदर्भ द्वारा पास करना
  3. const संदर्भ और उनका उपयोग कब करें
  4. संदर्भ का lifetime और dangling संदर्भ
← C++ Academy पर वापस जाएँ