2010-02-24 7 views
6

मैं वर्तमान में स्मार्ट पॉइंटर्स के उपयोग को पेश करके हमारे कोड बेस में कुछ कमजोरियों को ठीक करने की कोशिश कर रहा हूं। कोड बेस बहुत बड़ा है, और एक मकड़ी की तरह अंतःस्थापित है जिसकी कई कॉफी है।बूस्ट :: shared_ptr को मौजूदा (बड़े) C++ कोडबेस में कैसे पेश किया जाए?

मैं सोच रहा था कि क्या लोगों ने पहले कोशिश की थी और उनका दृष्टिकोण क्या था।

मेरा पहला कदम टाइपिफ़ वर्गों के लिए निम्नानुसार है।

#ifndef USE_SMART_POINTERS 
    #define USE_SMART_POINTERS 0 
#endif 

#if USE_SMART_POINTERS == 1 
    #include <boost/smart_ptr.hpp> 
#endif 


namespace ProductX 
{ 
    // forward decleration 
    class CTObject; 


    //typedefs 
    #if USE_SMART_POINTERS == 1 
     typedef boost::shared_ptr<CTObject> CTObjectPtr; 
    #else 
     typedef CTObject* CObjectPtr; 
    #endif 
} 

अब मैं इस तरह

CTObjectPtr i = NULL; 

को पूरी तरह से बोर्क जब स्मार्ट संकेत सक्षम हैं, करेंगे संकलन क्षेत्रों बातों का खजाना के लिए नेतृत्व करेंगे एहसास।

मैं सोच रहा था कि संकलन त्रुटियों के द्रव्यमान को कम करने के लिए मैं इस शुरुआती चरण में कुछ भी कर सकता था, या ऐसा लगता है कि मुझे लगता है कि मामले के आधार पर चीजों को केवल मामले में लेना है। typedefs मेरा मतलब है:

चीयर्स रिच

उत्तर

9

ऐसा मत करो।

संभवतः पुराने कोड में कम से कम इसे हटाएं? जो एक स्मार्ट सूचक के मामले में निश्चित रूप से असफल होगा।

स्मार्ट सूचक कुछ चीजें या नहीं, यानी कोड आधार के माध्यम से एक विशिष्ट उदाहरण का पीछा करते हैं। इसे काम करें, फिर आगे बढ़ें। शुभ लाभ!

+0

कोड की संपत्ति को देखते हुए मुझे लगता है कि आप सही हैं। मुझे पागल कोड खोपड़ी पर जाने के लिए धन्यवाद। – Rich

6

हर जगह स्मार्ट पॉइंटर्स पेश करने की कोशिश करने के बजाय आप Boehm-Demers-Weiser कचरा कलेक्टर का उपयोग कर सकते हैं और अपना कोड बेस बरकरार रख सकते हैं।

यह चक्रीय संदर्भों का भी ख्याल रखेगा।

+3

+1: चक्रीय संदर्भों के बारे में टिप्पणी महत्वपूर्ण है। यह कुछ ऐसा है जिसे स्मार्ट पॉइंटर्स का उपयोग करना चाहिए (चक्र को तोड़ने के लिए 'weak_ptr' का उपयोग करके) –

+6

बोहेम कलेक्टर के बारे में एक महत्वपूर्ण बात यह है कि यह रूढ़िवादी है - यह सभी कचरे को साफ करने की गारंटी नहीं है। न ही यह निर्धारिती है, सभी गैर संदर्भ संदर्भित कलेक्टरों की तरह। – Joel

3

ऐसा करने का कोई आसान तरीका नहीं है। जैसा कि आपने पाया है, boost::shared_ptr एस और मानक पॉइंटर्स अदला-बदले नहीं हैं। आप यहां क्या कर रहे हैं कोड को दोबारा कर रहा है, और दुर्भाग्यवश रिफैक्टरिंग में काफी समय लगता है और यह बहुत कठिन हो सकता है।

एसडीजी ने कहा, typedefshared_ptr एस के लिए आईएनजी पॉइंटर्स एक अच्छा विचार नहीं है, और केवल आपके द्वारा लिखे गए कोड की मात्रा को बढ़ाता है।

सबसे पहले, मैं उन पॉइंटर्स की पहचान करूंगा जिन्हें वास्तव में shared_ptr एस में बदलना होगा। जाहिर है आप सभी पॉइंटर्स को shared_ptr एस में बदलना नहीं चाहते हैं। अधिकतर std::auto_ptr एस या boost::scoped_ptr एस के रूप में बेहतर होगा और कुछ boost::weak_ptr के रूप में बेहतर होंगे, और आखिरकार कुछ सादे सी-स्टाइल पॉइंटर्स के रूप में ठीक हो सकते हैं।

बस प्रत्येक पॉइंटर के माध्यम से जाएं जो एक-एक करके बदलने की आवश्यकता है, इसके सभी संदर्भ ढूंढें, और आवश्यक समायोजन करें (उदा। delete पर कॉल को हटाएं)।

+0

शायद इस तरह के रूपांतरण को शुरू करने का सबसे आसान तरीका (यदि आप सुनिश्चित हैं कि कोई विशेष प्रकार हमेशा 'shared_ptr' या' weak_ptr' 'होना चाहिए) स्व-फैक्ट्री पैटर्न का उपयोग करना है - एक स्थिर साझा_प्टर एक्स बनाएं: : बनाएँ (...) विधि, और कन्स्ट्रक्टर को निजी या संरक्षित में बदलें। अब सभी कंपाइलर त्रुटियों को ठीक करें। एक समय में केवल एक ही प्रकार का काम करें! (ठीक है, आपको एक ही समय में व्युत्पन्न कक्षाएं करने की आवश्यकता हो सकती है।) – Miral

0

मैं साझा_ptr को मौजूदा बड़े कोडबेस में पेश करने में बहुत ही सीमित हूं। यदि आप वास्तव में त्रुटियों को ठीक करने के लिए स्मार्ट-पॉइंटर्स का उपयोग करना चाहते हैं तो मैं स्कॉप्ड पॉइंटर्स का उपयोग करने का सुझाव देता हूं और इसके अलावा मैं कोड को दोबारा सुधारता हूं और स्पष्ट स्वामित्व तैयार करता हूं।

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