2010-05-25 8 views
10

मान लीजिए मैं एक विशेषता के साथ एक सी ++ वर्ग है कि एक संदर्भ है:सी ++ में कक्षा नष्ट होने पर संदर्भ गुण नष्ट हो जाते हैं?

ClassB::ClassB(ClassA &_ref) : ref(_ref) { /* ... */ } 

मेरा प्रश्न है:: जब वर्ग का एक उदाहरण '

class ClassB { 
    ClassA &ref; 
public: 
    ClassB(ClassA &_ref); 
} 
बेशक

, निर्माता इस तरह से परिभाषित किया गया है क्लासबी 'नष्ट हो गया है, क्या' क्लासबी :: रेफ 'द्वारा संदर्भित वस्तु भी नष्ट हो गई है?

+1

"नष्ट" से आपका क्या मतलब है? बस विनाशक को बुलाओ, या स्मृति भी जारी करें?वैसे भी, उन चीजों में से कोई भी नहीं :) – fredoverflow

उत्तर

13

एक संदर्भ एक चर के लिए उपनाम के अलावा कुछ भी नहीं है, उपनाम वास्तविक चर नहीं, बल्कि नष्ट हो जाता है। आप इसे किसी प्रकार का सूचक मान सकते हैं, लेकिन इस तरह के (बुराई) विचारों से बचने के कारण हैं :)।

0

नहीं; संदर्भ पॉइंटर्स के लिए केवल एक वैकल्पिक वाक्यविन्यास हैं। यदि संदर्भ अस्वीकृत किया गया है तो वे संदर्भित मूल्य को संशोधित नहीं किया जाएगा।

+6

संदर्भ पॉइंटर्स के लिए वैकल्पिक वाक्यविन्यास नहीं हैं। वे अन्य वस्तुओं के लिए उपनाम हैं। आप कह सकते हैं "वैसे ही पॉइंटर्स जो कुछ भी इंगित करते हैं उन्हें हटा नहीं देते हैं, संदर्भों को नष्ट करने के संदर्भ में वे क्या कहते हैं।" – GManNickG

+0

एक पॉइंटर स्मृति में एक पता है, जिसे '*' या '-> 'ऑपरेटरों द्वारा संदर्भित किया गया है। एक संदर्भ स्मृति में एक पता है, जिसे '।' ऑपरेटर द्वारा संदर्भित किया गया है। यदि आप समझ में नहीं आते कि पॉइंटर्स और संदर्भ मूल रूप से समान कैसे हैं, तो आपके पास C++ में कोई व्यवसाय नहीं है। –

+1

@ जॉन: यदि आप मुझे मानक में उस स्थान पर इंगित करना चाहते हैं जहां यह कहता है "संदर्भ पॉइंटर्स के लिए वैकल्पिक वाक्यविन्यास हैं", मेरे अतिथि बनें। – GManNickG

2

नहीं। यही कारण है कि ~ClassB विनाशक की आवश्यकता है यदि क्लासबी ref के संग्रहण के लिए ज़िम्मेदार है, जो ऐसा नहीं हो सकता है।

+0

"जो खूनी असंभव है"। – MSalters

+0

सभी संभावित दुनिया के सर्वश्रेष्ठ में;) – msw

-1

मेरे पास हाथ पर सी ++ स्पेक नहीं है, लेकिन मेरा अनुमान "नहीं" है।

ऑब्जेक्ट नष्ट होने पर पॉइंटर्स स्वचालित रूप से हटाए नहीं जाते हैं, मुझे कोई कारण नहीं दिखता कि संदर्भ अलग होना चाहिए। इसके अलावा, संदर्भ स्वचालित रूप से नष्ट होने के कारण दिलचस्प बग के लिए परिपक्व होगा।

0

यदि आप इसे नष्ट करना चाहते हैं, तो आपको इसे सामान्य रूप से "स्मार्ट" पॉइंटर्स के माध्यम से किया जाना चाहिए, जैसे std :: shared_ptr या std :: unique_ptr), जो स्वचालित रूप से स्मृति को उचित तरीके से रिलीज़ करेगा बी के विनाश में संदर्भ के विपरीत, संदर्भ में वास्तविक स्मृति को छोड़कर, इन-भाषा संदर्भों में उनके साथ जुड़े कोई स्मृति मुक्त व्यवहार नहीं है।

आपको अपना खुद का मेमोरी मॉडल बनाना और समझना होगा। लोग आम तौर पर साझा उपयोग के लिए shared_ptr और संदर्भ गणना का उपयोग करते हैं।

7

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

On the other hand, const references can affect the lifetime of what they point to if they point to a temporary.

आपके मामले में ऐसा नहीं है।

+0

आपके "दूसरी ओर" के लिए +1। मुझे एहसास नहीं हुआ कि कॉन्स संदर्भ एक वस्तु जीवनकाल को प्रभावित कर सकते हैं। –

1

जब कोई ऑब्जेक्ट सी ++ में समाप्त हो जाता है, तो इसकी स्मृति को हटा दिया जाता है और इस प्रकार इसमें जो भी एम्बेडेड होता है (जैसे सदस्य चर) भी खो जाता है।

पॉइंटर के मामले में, सूचक एक सदस्य चर है जिसमें एक पता होता है, इसलिए पता "नष्ट" होता है लेकिन संदर्भित वस्तु, यदि कोई है, तो नहीं है।

संदर्भ सदस्य के मामले में, पता नष्ट हो गया है, लेकिन लक्ष्य प्रभावित नहीं है।

एक कक्षा एक विनाशक को परिभाषित कर सकती है जो विशेष व्यवहार को परिभाषित कर सकती है। एक आम ऐसा व्यवहार सदस्यों (यदि कोई हो) पर क्लीनअप संचालन का आह्वान करना है, और गतिशील रूप से आवंटित स्मृति को हटाने के लिए है। यहां, हालांकि, आपको पहले से ही एक ऑब्जेक्ट मिला है, इसलिए आपको इसे अस्वीकार नहीं करना चाहिए।

संबंधित मुद्दे