malloc
और free
का उपयोग क्या है जब हमारे पास new
और delete
C++ में है। मुझे लगता है कि free
और delete
दोनों का कार्य समान है।मॉलोक/फ्री का उपयोग क्यों करें, जब हमारे पास नया/हटाया जाए?
उत्तर
वे समान नहीं हैं। new
कन्स्ट्रक्टर को कॉल करता है, malloc
बस मेमोरी आवंटित करता है।
इसके अलावा, यह अपरिभाषित व्यवहार (new
अर्थात का उपयोग कर free
साथ और delete
साथ malloc
) दो मिश्रण है।
सी ++ में, आप new
और delete
, malloc
का उपयोग करने वाले रहे हैं और free
सी
ठीक है। लेकिन उनमें से दोनों स्मृति प्रबंधन के लिए उपयोग किया जाता है। तो जब नए का उपयोग करें और malloc का उपयोग कब करें? – Parag
@ पैराग "सी ++ में नहीं है, तो आपको नया उपयोग करना होगा और हटाएं" जवाब? मॉलोक/फ्री का प्रयोग न करें। – hvd
@ एचवीडी: यह सही सलाह नहीं है। सी ++ में 'नया' और 'डिलीट' का उपयोग करने का आपका तर्क पूरी तरह से सही नहीं है (विशेष रूप से निकोल के आपकी टिप्पणी के जवाब के बाद।) –
सी ++ में साथ संगतता कारणों के लिए देखते हैं, यह शायद ही कभी उपयोगी है कि एक malloc
& बजाय free
new
& का प्रयोग करेंगे delete
।
एक परिदृश्य मैं के बारे में सोच सकता है:
आप नहीं चाहते हैं अपनी स्मृति अंतर्निहित निर्माता कॉल से प्रारंभ करने के लिए, और सिर्फ placement new के लिए एक आश्वासन स्मृति आवंटन की जरूरत है तो यह malloc
उपयोग करने के लिए बिल्कुल ठीक है और free
new
और delete
के बजाय।
दूसरी ओर, यह जानना महत्वपूर्ण है कि malloc
और new
समान नहीं हैं!
दो महत्वपूर्ण अंतर सीधे ऊपर हैं: वर्ग के सदस्यों को प्रारंभ करने के लिए अपने वर्ग के निर्माताओं की callng
new
की गारंटी देता है, जबकिmalloc
नहीं है, एक एक अतिरिक्तmemset
या संबंधित फ़ंक्शन कॉल पोस्ट एकmalloc
करना होगा कुछ सार्थक करने के लिए आवंटित स्मृति को प्रारंभ करने के लिए।एक बड़ा लाभ यह है कि
new
के लिए आप हर आवंटन के बादNULL
के लिए जाँच करने के लिए, बस संलग्न अपवाद संचालकों आप अनावश्यक त्रुटिmalloc
विपरीत जाँच बचत काम करेगा की आवश्यकता नहीं है।
निश्चित रूप से, लेकिन 'ऑपरेटर न्यू' के लिए एक स्पष्ट कॉल उस के लिए पर्याप्त है, या 'नया char [n] '। (इसके लिए मॉलोक का उपयोग करने में कुछ भी गलत नहीं है, लेकिन यह आवश्यक नहीं है।) – hvd
@ एचवीडी: 'नया चार []' कुछ (बहुत छोटा) ओवरहेड है। अर्थात्, यह स्मृति ब्लॉक में आवंटित वर्णों की संख्या को संग्रहीत करता है। –
@ निकोलबोलस: और 'मुक्त' कैसे पता चलता है कि कितना मुफ्त है? 'malloc' भी आवंटित बाइट्स की संख्या स्टोर करेगा। – MSalters
सबसे पहले, जब आप 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()
तरह बातें हो जाएगा।)
उत्तर में बताए गए पहले उपयोग में रुचि रखने वालों के लिए, [मुझे आईएसओ सी ++ मानक अनुरूप अनुरूप कस्टम कैसे लिखना चाहिए और ऑपरेटरों को हटा देना चाहिए?] (Http://stackoverflow.com/ प्रश्न/7194127/कैसे-चाहिए-i-write-iso-c-standard-conformant-custom-new-and-delete-operators) एक अच्छा पठन है। –
@Als 100% अनुरूपता के लिए, आप भाषा, 'malloc' और' free' का उपयोग कर सकते हैं, और कुछ और नहीं। वास्तव में, ऐसे कई कार्य हैं जो स्मृति को आवंटित नहीं करेंगे (जैसे 'स्मृति'); मैं उन्हें भी सुरक्षित मानता हूं। व्यावहारिक रूप से, आप पूरी सी लाइब्रेरी के साथ शायद सुरक्षित हैं, लेकिन मेरे डीबगिंग कार्यान्वयन रिकर्सन के लिए जांच करते हैं, और 'malloc', 'memset' और' memcpy' से अधिक का उपयोग नहीं करते हैं, यदि' :: ऑपरेटर नया' कहा जा रहा है पुनरावर्ती (इसलिए यदि 'fprintf'' :: ऑपरेटर नया 'का उपयोग करता है, तो मैं अनंत रिकर्सन के साथ समाप्त नहीं होगा)। –
- 1. जब हमारे पास स्पेकफ़्लो है तो हमें कोडित ui का उपयोग क्यों करना चाहिए?
- 2. हमारे पास जावास्क्रिप्ट में बंद क्यों है?
- 3. क्या हमारे पास edittext
- 4. क्या हमारे पास IENumerable
- 5. क्या हमारे पास बुलेटन
- 6. जब हमारे पास रैपर वर्ग होते हैं, तो प्राइमेटिव का समर्थन क्यों किया जाता है?
- 7. हमारे पास C12+ में <cstdfloat> क्यों नहीं है?
- 8. जावा में हमारे पास निकास कोड क्यों हैं?
- 9. हमारे पास पाइथन में कॉल करने योग्य ऑब्जेक्ट्स क्यों हैं?
- 10. हमारे पास दोनों जंजीर सरणी और बहुआयामी सरणी क्यों है?
- 11. जब NoSQL का उपयोग नहीं किया जाए?
- 12. रेजर/सीएसएचटीएमएल - हमारे पास क्या लाभ है?
- 13. हमारे पास बिजनेस लॉजिक लेयर (बीएलएल)
- 14. रेल्स जब आपके पास गिट पोस्ट-हुक प्राप्त होता है तो कैपिस्ट्रानो का उपयोग क्यों करें?
- 15. क्या हमारे पास Google मानचित्र API V3
- 16. क्या हमारे पास ब्राउज़र साइड प्रमाणीकरण
- 17. क्या हमारे पास एकाधिक मदरप्रॉप माइक्रोडाटा टैगिंग
- 18. क्या हमारे पास सी ++ में बंद है?
- 19. जब Google वेब टूलकिट का उपयोग नहीं किया जाए?
- 20. अगर हमारे पास boost :: bind है तो boost :: mem_fn का उपयोग करने का क्या मतलब है?
- 21. जब/क्यों/UINavigationControllerDelegate प्रोटोकॉल इंस्टेंस विधियों का उपयोग कैसे करें?
- 22. मॉड्यूल का उपयोग क्यों करें जब कक्षा_वल अपने आप से
- 23. हमारे मोज़े को हाथ से घुमाने के बजाए एक मॉकिंग फ्रेमवर्क का उपयोग क्यों करें?
- 24. हैशपैप का उपयोग क्यों करें?
- 25. NSObjectController का उपयोग क्यों करें
- 26. किस कारण से हमारे पास low_case_with_underscores नामकरण सम्मेलन है?
- 27. जब जावा में स्थिर कीवर्ड का उपयोग नहीं किया जाए?
- 28. scala.collection.immutable का उपयोग क्यों करें।
- 29. जब हमारे पास कुछ फ़ील्ड पर पंक्तियां हैं तो हमारे पास JQGrid के लिए वैश्विक विस्तार/संकुचन कैसे हो सकता है?
- 30. जब आप जावा का उपयोग कर सकते हैं तो ज्योथन का उपयोग क्यों करें?
यह सी से खत्म किया है ... – Mysticial