2013-04-09 7 views
5

मैं सी ++ में एक कचरा कलेक्टर बनाने की कोशिश कर रहा हूं, मैंने इसे अपने सभी को बेस क्लास के रूप में डिजाइन किया है, जिसे कचरा कंडीडेट कहा जाता है, जिसमें एक स्थिर वेक्टर होता है जिसमें कचरे के लिए पॉइंटर्स होते हैं। प्रत्येक कचरे के साथ कंडिडेट करें कलेक्टर इंस्टेंस पुशिंग वेक्टर पर "यह"।कचरा कलेक्टर सी ++

फिर स्थिर कार्यकर्ता स्थिर वेक्टर में सभी पॉइंटर्स आता है और हटा देता है।

हटाने समारोह के बहुत शुरुआत में (प्रथम सूचक पर हटाना) मैं अमान्य सूचक पर इस्तेमाल किया गया था को नष्ट करते हुए कहा कोई त्रुटि मिलती है ...

इस स्थिर/गतिशील बंधन के साथ क्या करना है? मेरा मतलब है: क्या डिलीट ऑपरेटर अपेक्षित कार्य करने में असमर्थ है क्योंकि मैं "पिता" वर्ग पर हटाना चाहता हूं और वास्तव में यह एक बच्चा है?

वर्चुअल विनाशकों को बनाने के लिए इसे टालने का एक तरीका हो सकता है? (या वर्चुअल डिलीट फ़ंक्शन)?

या क्या मैंने पूरी तरह से कुछ याद किया?

ps: परीक्षण के लिए उपयोग की जाने वाली सभी वस्तुओं को गतिशील रूप से बनाया गया।

+1

क्या आपने अपने 'कचरा कैंडीडेट' कक्षा में डीटीओ वर्चुअल बनाया था? –

+1

नहीं, इसमें स्थैतिक/गतिशील बाध्यकारी से कोई लेना देना नहीं है। –

+2

यह केवल एक समस्या होगी यदि विनाशक 'आभासी' नहीं है। लेकिन किसी भी कोड को देखे बिना कहना मुश्किल है। क्या आप एक [एसएससीसीई] (http://sscce.org/) के साथ आ सकते हैं? –

उत्तर

0

क्या कोई कारण है कि आप अपना खुद का कस्टम कचरा कलेक्टर रोल कर रहे हैं? यदि आपकी सभी ऑब्जेक्ट्स गतिशील रूप से बनाई गई हैं, तो आप बूस्ट के स्मार्ट पॉइंटर्स (जैसे boost::shared_ptr) का उपयोग क्यों नहीं कर रहे हैं जो आपको एक अच्छी तरह से परीक्षण कचरा संग्रहण समाधान देने के लिए RAII का उपयोग करता है?

मैं पूछता हूं क्योंकि आम तौर पर एक परियोजना के सॉफ्टवेयर विकास जीवन चक्र के दौरान, आप अपने द्वारा लिखे गए कोड में फिक्सिंग बग को समाप्त करते हैं (अधिकतर समय, कम से कम)। तो क्या कोई कारण है कि आप पहिया का पुन: आविष्कार कर रहे हैं?

+0

क्योंकि वह कुछ बेहतर बनाना चाहता है। – peterh

+0

हम सब :) – Carl

+0

हम इस मानसिकता जानते हैं नहीं करना चाहिए और यह मदद - या कम से कम शांति में यह करते हैं - भले ही हम अन्य आदर्शों की है। – peterh

0

अपनी खुद की जीसी रोल करने की बजाय, मुझे लगता है कि आपको Boehm Conservative GC या स्मार्ट पॉइंटर्स का उपयोग करना चाहिए। न तो एकदम सही है:

  • C++ standard library and Boehm garbage collector:

    • बोहम कलेक्टर विशेष उपयोग करने के लिए कुछ प्रयास की आवश्यकता कर सकते हैं आवंटित और (यदि आप इसका इस्तेमाल करते हैं) पुनःआवंटन विधियों, और मौजूदा पुस्तकालयों हो रही के साथ खेलने के लिए आवश्यक है कि आप

    • Is it possible to use Boehm garbage collector only for the part of the program?

  • स्मार्ट पॉइंटर्स प्रत्येक बार एक ओवरहेड जोड़ते हैं जब आप एक चर के लिए पॉइंटर असाइन करते हैं। वे उन ऑब्जेक्ट नेटवर्क से निपटते नहीं हैं जिनमें पॉइंटर चक्र होते हैं। ऑब्जेक्ट्स को इकट्ठा करने के लिए पहुंचने की अनुमति देने के लिए आपको चक्रों को मैन्युअल रूप से तोड़ने की आवश्यकता है।

इसके बावजूद, बोहेम जीसी या स्मार्ट पॉइंटर्स में से कोई भी आपके स्वयं के समाधान को चलाने से कम कार्यान्वयन और रखरखाव प्रयास होगा।

+0

बोहम जीसी समय-समय पर पूरे ढेर और ढेर क्रॉल करता है हमारे malloced संकेत की घटनाओं को खोजने के लिए। ऐसा लगता है कि एक स्मृति खंड आवंटित किया गया है, भले ही इसका सूचक कुछ गैर-सूचक डेटा की यादृच्छिक संरचना हो। और यह भी डेटा क्रॉल करता है। मुझे लगता है कि बोहेमजीसी के पीछे एकमात्र कारण यह है कि वर्तमान में कोई बेहतर ओपनसोर्स सी/सी ++ कचरा कलेक्टर नहीं है। इसे लिखा जाना चाहिए। – peterh

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