2012-04-02 7 views
5

malloc और free का उपयोग क्या है जब हमारे पास new और delete C++ में है। मुझे लगता है कि free और delete दोनों का कार्य समान है।मॉलोक/फ्री का उपयोग क्यों करें, जब हमारे पास नया/हटाया जाए?

+1

यह सी से खत्म किया है ... – Mysticial

उत्तर

8

वे समान नहीं हैं। new कन्स्ट्रक्टर को कॉल करता है, malloc बस मेमोरी आवंटित करता है।

इसके अलावा, यह अपरिभाषित व्यवहार (new अर्थात का उपयोग कर free साथ और delete साथ malloc) दो मिश्रण है।

सी ++ में, आप new और delete, malloc का उपयोग करने वाले रहे हैं और free सी

+0

ठीक है। लेकिन उनमें से दोनों स्मृति प्रबंधन के लिए उपयोग किया जाता है। तो जब नए का उपयोग करें और malloc का उपयोग कब करें? – Parag

+4

@ पैराग "सी ++ में नहीं है, तो आपको नया उपयोग करना होगा और हटाएं" जवाब? मॉलोक/फ्री का प्रयोग न करें। – hvd

+0

@ एचवीडी: यह सही सलाह नहीं है। सी ++ में 'नया' और 'डिलीट' का उपयोग करने का आपका तर्क पूरी तरह से सही नहीं है (विशेष रूप से निकोल के आपकी टिप्पणी के जवाब के बाद।) –

5

सी ++ में साथ संगतता कारणों के लिए देखते हैं, यह शायद ही कभी उपयोगी है कि एक malloc & बजाय freenew & का प्रयोग करेंगे delete

एक परिदृश्य मैं के बारे में सोच सकता है:

आप नहीं चाहते हैं अपनी स्मृति अंतर्निहित निर्माता कॉल से प्रारंभ करने के लिए, और सिर्फ placement new के लिए एक आश्वासन स्मृति आवंटन की जरूरत है तो यह malloc उपयोग करने के लिए बिल्कुल ठीक है और freenew और delete के बजाय।

दूसरी ओर, यह जानना महत्वपूर्ण है कि malloc और new समान नहीं हैं!
दो महत्वपूर्ण अंतर सीधे ऊपर हैं: वर्ग के सदस्यों को प्रारंभ करने के लिए अपने वर्ग के निर्माताओं की callng

  • new की गारंटी देता है, जबकि malloc नहीं है, एक एक अतिरिक्त memset या संबंधित फ़ंक्शन कॉल पोस्ट एक malloc करना होगा कुछ सार्थक करने के लिए आवंटित स्मृति को प्रारंभ करने के लिए।

  • एक बड़ा लाभ यह है कि new के लिए आप हर आवंटन के बाद NULL के लिए जाँच करने के लिए, बस संलग्न अपवाद संचालकों आप अनावश्यक त्रुटि malloc विपरीत जाँच बचत काम करेगा की आवश्यकता नहीं है।

+0

निश्चित रूप से, लेकिन 'ऑपरेटर न्यू' के लिए एक स्पष्ट कॉल उस के लिए पर्याप्त है, या 'नया char [n] '। (इसके लिए मॉलोक का उपयोग करने में कुछ भी गलत नहीं है, लेकिन यह आवश्यक नहीं है।) – hvd

+2

@ एचवीडी: 'नया चार []' कुछ (बहुत छोटा) ओवरहेड है। अर्थात्, यह स्मृति ब्लॉक में आवंटित वर्णों की संख्या को संग्रहीत करता है। –

+0

@ निकोलबोलस: और 'मुक्त' कैसे पता चलता है कि कितना मुफ्त है? 'malloc' भी आवंटित बाइट्स की संख्या स्टोर करेगा। – MSalters

3

सबसे पहले, जब आप new और delete की बात करते हैं, मुझे लगता है आप भाव, और नहीं operator new और operator delete कार्यों मतलब है। new और delete अभिव्यक्ति malloc और free से संबंधित नहीं हैं, और केवल आकस्मिक रूप से स्मृति प्रबंधित करते हैं; उनकी मुख्य भूमिका ऑब्जेक्ट आजीवन का प्रबंधन करती है: new अभिव्यक्ति operator new मेमोरी प्राप्त करने के लिए फ़ंक्शन को कॉल करेगी, और फिर कन्स्ट्रक्टर को कॉल करें; delete अभिव्यक्ति operator delete से को स्मृति मुक्त करने से पहले विनाशक को कॉल करेगी।अधिकांश भाग के लिए, वस्तुओं बनाया गया था, और नहीं आवंटित, जिसका अर्थ है विशेष रूप से अभिव्यक्तियों का उपयोग करना।

कुछ दुर्लभ मामले हैं जहां कोई आवंटन अलग करना चाहता है और प्रारंभिकरण (निर्माण); std::vector जैसी चीजों को कार्यान्वित करना शास्त्रीय उदाहरण है, जहां आप एक ही समय में कई ऑब्जेक्ट्स आवंटित करेंगे, लेकिन केवल एक समय में एक ही निर्माण करता है। ऐसे मामलों में, आप आवंटन के लिए operator new फ़ंक्शन का उपयोग करेंगे, और प्रारंभिकरण के लिए नया प्लेसमेंट; दूसरे छोर पर पर, आप विनाश के लिए कन्स्ट्रक्टर ( p->~T() जैसे कुछ) को स्पष्ट रूप से कॉल करेंगे, और operator delete फ़ंक्शन पर स्मृति को मुक्त करें।

बंद हाथ, मैं केवल दो मामलों के बारे में सोच सकता हूं जहां आप malloc और free सी ++ में उपयोग करेंगे। पहला ::operator new और ::operator delete फ़ंक्शंस की अपनी प्रतिस्थापन को लागू करना है। (मैं अक्सर की जगह वैश्विक ::operator new और डिबगिंग संस्करणों है, जो आवंटन का पता लगाने, आवंटित स्मृति, आदि के आसपास गार्ड क्षेत्रों डाल के साथ ::operator delete) अन्य है जब एक विरासत पुस्तकालय सी में लिखे के साथ बातचीत: पुस्तकालय के लिए कहते हैं, तो पारित स्मृति के लिए सूचक malloc द्वारा आवंटित (यह free का उपयोग कर खुद को मुक्त होगा क्योंकि), या अधिक सामान्यतः, malloc द्वारा आबंटित स्मृति के लिए सूचक है, जो आप को मुक्त करने की उम्मीद कर रहे हैं देता है, तो आप का उपयोग करना चाहिए malloc और free । ( बेहतर पुस्तकालयों को अपने स्वयं के आवंटन और आवंटन रद्द करने काम करता है, जो कम या ज्यादा क्या new और delete ऑपरेटरों करते हैं प्रदान करेगा, लेकिन वहाँ हमेशा strdup() तरह बातें हो जाएगा।)

+0

उत्तर में बताए गए पहले उपयोग में रुचि रखने वालों के लिए, [मुझे आईएसओ सी ++ मानक अनुरूप अनुरूप कस्टम कैसे लिखना चाहिए और ऑपरेटरों को हटा देना चाहिए?] (Http://stackoverflow.com/ प्रश्न/7194127/कैसे-चाहिए-i-write-iso-c-standard-conformant-custom-new-and-delete-operators) एक अच्छा पठन है। –

+0

@Als 100% अनुरूपता के लिए, आप भाषा, 'malloc' और' free' का उपयोग कर सकते हैं, और कुछ और नहीं। वास्तव में, ऐसे कई कार्य हैं जो स्मृति को आवंटित नहीं करेंगे (जैसे 'स्मृति'); मैं उन्हें भी सुरक्षित मानता हूं। व्यावहारिक रूप से, आप पूरी सी लाइब्रेरी के साथ शायद सुरक्षित हैं, लेकिन मेरे डीबगिंग कार्यान्वयन रिकर्सन के लिए जांच करते हैं, और 'malloc', 'memset' और' memcpy' से अधिक का उपयोग नहीं करते हैं, यदि' :: ऑपरेटर नया' कहा जा रहा है पुनरावर्ती (इसलिए यदि 'fprintf'' :: ऑपरेटर नया 'का उपयोग करता है, तो मैं अनंत रिकर्सन के साथ समाप्त नहीं होगा)। –

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