इन दो वर्गों पर विचार करें?कचरा कलेक्टर और वृत्तीय संदर्भ
मान लीजिए मैं यह कर:
void f()
{
B b = new B();
}
इस विधि में, मैं b
बुलाया B
का एक उदाहरण बना सकते हैं और विधि रिटर्न, b
दायरे से बाहर चला जाता है जब, और जीसी यह इकट्ठा करने के लिए सक्षम होना चाहिए , लेकिन अगर इसे इकट्ठा करना था, तो उसे a
पहले एकत्र करना होगा जो B
का सदस्य है, और a
एकत्र करने के लिए, इसे पहले b
एकत्र करने की आवश्यकता है जो A
का सदस्य है। यह परिपत्र बन जाता है। तो मेरा सवाल यह है: क्या जीसी को वस्तुओं को इकट्ठा करने से रोकने के लिए इस तरह का परिपत्र संदर्भ है?
- यदि हां, तो हम इस समस्या से कैसे बच सकते हैं? हम कैसे सुनिश्चित कर सकते हैं कि हमारे वर्ग डिजाइन में हमारे पास परिपत्र संदर्भ नहीं है? क्या कोई उपकरण (या कंपाइलर विकल्प) है जो हमें परिपत्र संदर्भ का पता लगाने में मदद करता है?
- यदि नहीं, तो हम कहां और क्यों
WeakReference
कक्षा का उपयोग करते हैं? इसका उद्देश्य क्या है?
यहां एक नज़र डालें http://stackoverflow.com/questions/400706/circular-references-cause-memory-leak –
कम से कम तार्किक रूप से संदर्भों में से एक हमेशा कमजोर होता जा रहा है: आपके उदाहरण में, साफ़ 'ए 'बी 'पर निर्भर नहीं हो सकता है, क्योंकि' ए 'को' बी 'के सदस्य के रूप में पहले बनाया जाना चाहिए, और इसलिए' ए 'केवल' बी 'के लिए एक कमजोर संदर्भ रख सकता है। इस प्रकार पहले 'बी' को नष्ट करना और फिर 'ए' को नष्ट करना सुरक्षित है। पुनरावर्ती तर्क, हर कंप्यूटर कार्यक्रम इस प्रकार होना चाहिए। कभी * सत्य *, पूरी तरह से सममित परिपत्र निर्भरता नहीं हो सकती है। –
@ केरेकस्क: मैं उस तर्क से सहमत हूं। लेकिन यह सृजन के बिंदु से देखा जाता है। क्या जीसी इसका विश्लेषण करने जा रहा है (यानी इस तरह के वर्गों के प्रत्येक तरीके में कोड, केवल तभी यह निष्कर्ष तक पहुंच सकता है)? मेरा मतलब है, अगर आप वस्तुओं को बनाने के बाद वस्तुओं को देखते हैं, तो यह बहुत ही समस्याग्रस्त दिखता है। – Nawaz