malloc
की वापसी के लिए जांच करने से आपके आवंटन को सुरक्षित या कम त्रुटि प्रवण बनाने में आपकी सहायता नहीं होती है। यह एक जाल भी हो सकता है यदि यह एकमात्र परीक्षण है जिसे आप कार्यान्वित करते हैं।
0
के तर्क के साथ कहा जाने वाला मानक malloc
को एक अद्वितीय पता लौटने की अनुमति देता है, जो एक शून्य सूचक नहीं है और जिसे आपके पास पहुंचने का अधिकार नहीं है। इसलिए यदि आप परीक्षण करते हैं कि वापसी 0
है लेकिन malloc
, calloc
या realloc
पर तर्कों का परीक्षण न करें तो आपको बाद में एक सेगफॉल्ट का सामना करना पड़ सकता है।
यह त्रुटि स्थिति (स्मृति थका हुआ) "होस्टेड" वातावरण में काफी दुर्लभ है। आमतौर पर आप इस तरह की त्रुटि से परेशान होने से पहले परेशानी में हैं। (लेकिन यदि आप रनटाइम लाइब्रेरीज़ लिख रहे हैं, तो यह एक कर्नेल हैकर या रॉकेट बिल्डर है, यह अलग है, और वहां परीक्षण सही समझ में आता है।)
लोग तब उस त्रुटि स्थिति के जटिल कैप्चर के साथ अपने कोड को सजाने के लिए जाते हैं जो कई लाइनें, perror
और उस तरह की चीजें कर रही हैं, जो कोड की पठनीयता पर असर डाल सकती हैं।
मुझे लगता है कि यह "malloc
की वापसी की जांच करें" बहुत अधिक है, कभी-कभी यहां तक कि काफी हद तक बचाव भी किया जाता है। अन्य चीजें अधिक महत्वपूर्ण हैं:
- हमेशा चर, हमेशा प्रारंभ करें। सूचक चर के लिए यह महत्वपूर्ण है, चीजें बहुत खराब होने से पहले कार्यक्रम को अच्छी तरह से दुर्घटनाग्रस्त होने दें।
struct
में अनियंत्रित सूचक सदस्य त्रुटियों का एक महत्वपूर्ण कारण हैं जो खोजना मुश्किल है।
- हमेशा
malloc
और कं के लिए तर्क की जाँच करता है, तो यह एक संकलन समय निरंतर sizof toto
है कि कोई समस्या नहीं हो सकता है, लेकिन हमेशा सुनिश्चित करें कि आपके वेक्टर आवंटन ठीक से शून्य मामले संभालती है।
malloc
की वापसी के लिए जांचने के लिए एक आसान बात यह है कि इसे memset(malloc(n), 0, 1)
जैसे कुछ के साथ लपेटें। यह पहले बाइट में 0
लिखता है और malloc
में कोई त्रुटि होती है या n
0
से शुरू होने के लिए अच्छी तरह से क्रैश होता है।
स्रोत
2011-10-30 22:32:56
मुझे लगता है कि आपको सी ++ में मॉलोक का उपयोग नहीं करना चाहिए: http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – lc2817
@ lc2817 आपको केवल उपयोग करना चाहिए malloc अगर आप एक सी इंटरफ़ेस के साथ कोड लिख रहे हैं (यानी कार्य जो सी से उपयोग किए जाते हैं लेकिन सी ++ में लिखे गए हैं) ** और ** सी कोड उस स्मृति को मुक्त करने के लिए ज़िम्मेदार है। इस परिशुद्धता के लिए –
@WTP धन्यवाद। हालांकि, मुझे नहीं पता कि यह मामला यहां है या नहीं। – lc2817