2010-08-17 21 views
5

क्या यह वास्तव में कुछ कंप्यूटर्स/मशीनों पर काम करता है लेकिन दूसरों पर यह ढेर भ्रष्टाचार और दुर्घटनाओं का कारण बनता है?'नए' कारण भ्रष्टाचार के कारण आवंटित सूचक पर मुफ्त() क्यों कॉलिंग करता है?

क्या किसी के पास कवर के तहत क्या चल रहा है इस बारे में कोई अंतर्दृष्टि है?

+0

आपको अब और हमेशा के लिए अपरिभाषित व्यवहार मिलता है। [ऐसा मत करो।] (Http://www.parashift.com/c++-faq-lite/freestore-mgmt.html#faq-16.3) – GManNickG

+8

वह पूछ रहा है कि आपको यह व्यवहार क्यों मिलता है, बस उसे नहीं करना यह किसी भी चीज की समझ में मदद नहीं करता है। – bobDevil

+1

@bobDevil: ठीक है, व्यवहार C++ मानक द्वारा अपरिभाषित है, जिसका अर्थ है कि भाषा कार्यान्वयनकर्ता उचित व्यवहार को लागू करने की कोई इच्छा महसूस नहीं करेंगे। कोई पारंपरिक व्यवहार नहीं है ("ऐसा मत करो!") के अलावा, इसलिए यहां तक ​​कि एक अनौपचारिक मानक भी नहीं है। अनुभवजन्य, व्यवहार अलग-अलग लगता है। इसलिए, आप किसी विशेष व्यवहार पर भरोसा नहीं कर सकते हैं, और कोई कंपाइलर इंजीनियर आपको कोई सहानुभूति देने वाला नहीं है। यह कहना पर्याप्त कारण है कि "ऐसा मत करो!" किसी भी विशेष व्यवहार के कारण किसी भी स्पष्टीकरण के बिना। –

उत्तर

17

सी ++ ऑब्जेक्ट पर एक विनाशक को कॉल करना चाहता है जब आप delete का उपयोग करते हैं, लेकिन इसे free पर पास करने की अनुमति नहीं है। यदि ऑब्जेक्ट में अन्य ऑब्जेक्ट्स हैं तो उन ऑब्जेक्ट्स 'विनाशकों को या तो नहीं कहा जाएगा। अगर वस्तु में पॉइंटर्स थे तो वे मुक्त नहीं होंगे।

साथ ही सी ++ के new और delete वास्तव में malloc से स्मृति की एक बड़ी राशि का अनुरोध और (नाशक समारोह का पता भंडारण की तरह) बही खाता के लिए अतिरिक्त इस्तेमाल कर सकते हैं, और इसलिए सूचक आप free के लिए पारित किया वास्तव में एक नहीं होगा वह malloc एड था।

2

मानक के अनुसार आपके लिए आवंटन/आवंटन रद्द समारोह पूरी तरह से (new - delete, new[] - delete[], malloc - free) से मेल करने के लिए है। सैद्धांतिक रूप से, यह काफी संभव है कि कुछ कंपाइलर operator new() को सरल malloc() के रूप में कार्यान्वित करते हैं, इसलिए इससे कोई दुर्घटना नहीं होती है, लेकिन "केवल" विनाशक कॉल को छोड़कर (जो स्वयं ही खराब है)। हालांकि, operator[] मेमोरी के आवंटित खंड में तत्वों की संख्या संग्रहीत कर सकता है, इस मामले में, अंकों द्वारा malloc() (शुरुआत में नहीं) द्वारा आवंटित कुछ ब्लॉक के अंदर पते लौटाया गया, जिसका अर्थ है कि आप इसे free() से मुक्त नहीं कर सकते हैं।

2

नया ऑपरेटर भी अधिभार योग्य है। अगर किसी ने एक नया ऑपरेटर लिखा जो कुछ अलग कर रहा था, तो मेमोरी पूल से हथियाने वाले पॉइंटर्स कहें, उन पॉइंटर्स पर मुफ़्त कॉल करना बहुत खतरनाक हो सकता है।

+1

... उन पॉइंटर्स पर 'फ्री' कॉल करना ... – Potatoswatter

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