हां, पॉइंटर्स के साथ कोई समस्या है। बहुत संभावना है कि आप उस व्यक्ति का उपयोग कर रहे हैं जो ठीक से शुरू नहीं हुआ है, लेकिन यह भी संभव है कि आप दोहरी फ्री या कुछ ऐसे के साथ अपने मेमोरी प्रबंधन को गड़बड़ कर रहे हों।
स्थानीय चर के रूप में अनियंत्रित पॉइंटर्स से बचने के लिए, जितनी देर हो सके उन्हें घोषित करने का प्रयास करें, अधिमानतः (और यह हमेशा संभव नहीं है) जब उन्हें सार्थक मूल्य के साथ प्रारंभ किया जा सकता है। स्वयं को समझें कि कोड की जांच करके उनका उपयोग करने से पहले उनका मूल्य होगा। यदि आपको इसके साथ कठिनाई है, तो उन्हें एक शून्य सूचक स्थिरांक (आमतौर पर NULL
या 0
के रूप में लिखा गया) के रूप में प्रारंभ करें और उन्हें जांचें।
सदस्य मूल्यों के रूप में अनियमित पॉइंटर्स से बचने के लिए, सुनिश्चित करें कि वे कन्स्ट्रक्टर में ठीक से प्रारंभ किए गए हैं, और कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर में ठीक से संभाले गए हैं। स्मृति प्रबंधन के लिए init
फ़ंक्शन पर भरोसा न करें, हालांकि आप अन्य प्रारंभिकरण के लिए कर सकते हैं।
यदि आपकी कक्षा को कॉपी कन्स्ट्रक्टर या असाइनमेंट ऑपरेटर की आवश्यकता नहीं है, तो आप उन्हें निजी सदस्य फ़ंक्शन के रूप में घोषित कर सकते हैं और उन्हें कभी परिभाषित नहीं कर सकते हैं। इससे एक कंपाइलर त्रुटि हो जाएगी यदि वे स्पष्ट रूप से या स्पष्ट रूप से उपयोग किए जाते हैं।
लागू होने पर स्मार्ट पॉइंटर्स का उपयोग करें। यहां बड़ा फायदा यह है कि, यदि आप उनके साथ रहते हैं और लगातार उनका उपयोग करते हैं, तो आप delete
लिखने से पूरी तरह से बच सकते हैं और कुछ भी डबल-हटाया नहीं जाएगा।
सी-शैली तारों और सरणी के बजाय, जब भी संभव हो, सी ++ तारों और कंटेनर कक्षाओं का उपयोग करें। [i]
के बजाय .at(i)
का उपयोग करने पर विचार करें, क्योंकि यह सीमाओं की जांच को मजबूर करेगा। देखें कि कम से कम डीबग मोड में [i]
पर सीमाओं की जांच करने के लिए आपका कंपाइलर या लाइब्रेरी सेट की जा सकती है या नहीं। सेगमेंटेशन दोष बफर ओवररन्स के कारण हो सकते हैं जो पूरी तरह से अच्छे पॉइंटर्स पर कचरा लिखते हैं।
उन चीजों को करने से सेगमेंटेशन दोषों और अन्य स्मृति समस्याओं की संभावना कम हो जाएगी। वे सब कुछ ठीक करने में असफल रहेंगे, और यही कारण है कि आपको अब वाल्ग्रिंड का उपयोग करना चाहिए और फिर जब आपको कोई समस्या नहीं है, और जब आप करते हैं तो valgrind और gdb।
स्रोत
2010-09-15 17:28:27
अच्छी तरह से यह 1 के बजाय 4 बाइट होगा ... लेकिन सिद्धांत ठीक है। –
क्या मैं अपने [गैर-घुसपैठ ढेर डीबगर] से लिंक कर सकता हूं (http://stackoverflow.com/questions/2835416)? :-) – fredoverflow
इसके लिए जाएं। हम यहां दूसरों की मदद करने के बारे में सब कुछ कर रहे हैं ताकि मदद की जा सके। – wheaties