2012-02-11 6 views
14

मैं इस प्रकार हमारे codebase में क्लासिक नई/हटाने बेमेल त्रुटि की खोज की है? क्या यह स्मृति रिसाव या त्रुटि का कारण बनता है? क्या नतीजे सामने आए। हम कुछ स्मृति मुद्दे हैं, लेकिन यह काफी गंभीर हमारे सभी लक्षण (ढेर भ्रष्टाचार आदि)नया/डिलीट ऑपरेटर मिस्चैच त्रुटि कितना गंभीर है?</p> <pre><code>char *foo = new char[10]; // do something delete foo; // instead of delete[] foo; </code></pre> <p>इस बस कितना गंभीर है:

संपादित व्याख्या करने के लिए नहीं लगता है: यह सिर्फ सरणी के पहले सदस्य मुक्त करता है स्पष्टता
के लिए अतिरिक्त सवाल? या
क्या यह सिस्टम को सरणी का ट्रैक खो देता है? या
भ्रष्ट स्मृति कुछ तरीका है?

उत्तर

16

यह अनिर्धारित व्यवहार गंभीर है (यह काम कर सकता है, यह क्रैश हो सकता है, यह कुछ और कर सकता है)।

+0

त्वरित उत्तर के लिए धन्यवाद। तो वास्तव में अपरिभाषित? जैसा कि, कोई भी नहीं बता सकता कि क्या हो सकता है? यदि ऐसा है, तो यह हमारे अवलोकनों को समझा सकता है। –

+0

@AndrewS। वास्तव में अपरिभाषित। मुझे याद है कि उदाहरण के लिए विजुअल स्टूडियो में "काम किया"। – cnicutar

+2

अपरिभाषित - यानी कंपाइलर/ओएस पर निर्भर करता है। –

8

पहली बार, के बजाय delete पर कॉल करना बहुत बुरा नहीं होना चाहिए: आप पहली वस्तु को नष्ट कर देते हैं और आप कुछ स्मृति रिसाव को उकसाते हैं।

लेकिन: तो, delete (या delete[]) स्मृति को मुक्त करने के free कहता है। और स्मृति को मुक्त करने के लिए free को मूल रूप से आवंटित पते की आवश्यकता है। या, बात यह है कि new मॉलोक द्वारा आवंटित मूल एड्रेस लौटाता है, new[]एक अलग पता देता है।

new[] द्वारा दिए गए पते पर मुफ्त कॉलिंग एक क्रैश को उत्तेजित करता है (यह स्मृति को अजीब रूप से मुक्त करता है)।

बेहतर समझ के लिए ये बहुत शिक्षाप्रद लिंक देखें:

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782

http://web.archive.org/web/20080703153358/http://taossa.com/index.php/2007/01/03/attacking-delete-and-delete-in-c

इन लेखों से यह भी स्पष्ट है क्यों बुला हटाने की बजाय delete[] भी एक बहुत बुरा विचार है।

तो, जवाब देने के लिए: हाँ, यह एक बहुत ही गंभीर त्रुटि है। यह स्मृति को दूषित करता है (केवल पहली वस्तु के विनाशक को बुलावा देने के बाद)।

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