new/ deleteऔर malloc/ के बीच क्या अंतर है free?
संबंधित (डुप्लिकेट?): किन मामलों में मैं मॉलोक बनाम नए का उपयोग करता हूं?
new/ deleteऔर malloc/ के बीच क्या अंतर है free?
संबंधित (डुप्लिकेट?): किन मामलों में मैं मॉलोक बनाम नए का उपयोग करता हूं?
जवाबों:
सुविधाओं की तुलना तालिका:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
तकनीकी रूप से नई द्वारा आवंटित की गई मेमोरी 'फ्री स्टोर' से आती है जबकि मॉलॉक द्वारा आवंटित मेमोरी 'हीप' से आती है। क्या ये दोनों क्षेत्र समान हैं एक कार्यान्वयन विवरण है, जो एक और कारण है कि मॉलोक और नए को मिश्रित नहीं किया जा सकता है।
If ptr is NULL, no operation is performed.
newऑपरेटर फ्री स्टोर से मेमोरी आवंटित करता है (जिसे डायनामिक मेमोरी के रूप में भी जाना जाता है) और ढेर )। गतिशील भंडारण पर सी ++ 14 मानक, खंड 3.7.4 का कहना है कि "वस्तुओं को प्रोग्राम एक्जीक्यूटिव (1.9) के दौरान गतिशील रूप से बनाया जा सकता है, नए-भावों (5.3.4) का उपयोग करके, और डिलीट-एक्सप्रेशंस का उपयोग करके नष्ट कर दिया जाता है।"
सबसे अधिक प्रासंगिक अंतर यह है कि newऑपरेटर मेमोरी आवंटित करता है, फिर कंस्ट्रक्टर को कॉल करता है, और deleteविध्वंसक को कॉल करता है और फिर मेमोरी को हटा देता है।
newऑब्जेक्ट के ctor को deleteकॉल करता है, dtor को कॉल करता है।
mallocऔर freeबस का आवंटन और कच्चे स्मृति को छोड़ दें।
new/ deleteC ++ है, malloc/ freeअच्छे पुराने C से आता है।
C ++ में, newऑब्जेक्ट्स कन्स्ट्रक्टर को deleteकॉल करता है और डिस्ट्रक्टर को कॉल करता है।
mallocऔर free, OO से पहले के अंधेरे युगों से आते हैं, केवल ऑब्जेक्ट के किसी भी कोड को निष्पादित किए बिना, मेमोरी आवंटित और मुक्त करते हैं।
एकमात्र समानता यह है कि malloc/ newदोनों एक पॉइंटर लौटाते हैं जो ढेर पर कुछ मेमोरी को संबोधित करता है, और वे दोनों गारंटी देते हैं कि एक बार मेमोरी के इस तरह के ब्लॉक को वापस कर दिया गया है, यह तब तक वापस नहीं आएगा जब तक कि आप इसे पहले खाली / हटा नहीं देते। यही है, वे दोनों "स्मृति आवंटित" करते हैं।
हालांकि, new/ delete, इसके अलावा में मनमाने ढंग से अन्य काम करने कंस्ट्रक्टर्स, विनाशकर्ता और ऑपरेटर ओवरलोडिंग के माध्यम से। malloc/ freeकेवल कभी आवंटित और मुक्त स्मृति।
वास्तव में, newपर्याप्त रूप से अनुकूलन योग्य है कि यह जरूरी नहीं है कि मेमोरी को ढेर से वापस लौटाएं, या यहां तक कि स्मृति को आवंटित करें। हालाँकि डिफ़ॉल्ट newकरता है।
नए और मॉलोक के बीच मुख्य अंतर यह है कि नया ऑब्जेक्ट के निर्माता को आमंत्रित करता है और ऑब्जेक्ट को नष्ट करने के लिए संबंधित कॉल को नष्ट करता है।
अन्य अंतर हैं:
newप्रकार-सुरक्षित है, mallocप्रकार की वस्तुएँ लौटाता हैvoid*
newत्रुटि पर एक अपवाद फेंकता है, mallocरिटर्न NULLऔर गलत सेट करता है
newएक ऑपरेटर है और इसे ओवरलोड किया जा सकता है, mallocएक फ़ंक्शन है और इसे ओवरलोड नहीं किया जा सकता है
new[], जो सरणियों का आवंटन करता है, की तुलना में अधिक सहज और सुरक्षित है malloc
mallocव्युत्पन्न आवंटन के माध्यम से आकार दिया जा सकता realloc, newव्युत्पन्न आवंटन आकार नहीं बदला जा सकता है
mallocप्रकारों newकी एक सरणी आवंटित करने के लिए कहा जाना चाहिए , स्मृति के एक एन-बाइट हिस्सा आवंटित कर सकते charहैं
मतभेदों को देखते हुए, एक सारांश है मॉलॉक सी-एस्क, नया है सी ++ - एस्क। अपने कोड आधार के लिए सही महसूस करने वाले का उपयोग करें।
हालाँकि, यह नए और मॉलोक के लिए अलग-अलग मेमोरी एलोकेशन एल्गोरिदम का उपयोग करके लागू किया जाना है, लेकिन अधिकांश सिस्टमों में आंतरिक रूप से मॉलोक का उपयोग करके लागू किया जाता है, कोई सिस्टम-स्तरीय अंतर नहीं देता है।
कुछ चीजें हैं जो कर रहे हैं newकि करता है mallocनहीं करता है:
new उस ऑब्जेक्ट के कंस्ट्रक्टर को कॉल करके ऑब्जेक्ट का निर्माण करता हैnew आवंटित मेमोरी के टाइपकास्टिंग की आवश्यकता नहीं है।इसलिए, यदि आप उपयोग करते हैं malloc, तो आपको स्पष्ट रूप से उपरोक्त चीजों को करने की आवश्यकता है, जो हमेशा व्यावहारिक नहीं होता है। इसके अतिरिक्त, newअतिभारित किया जा सकता है लेकिन mallocनहीं किया जा सकता है।
एक शब्द में, यदि आप C ++ का उपयोग करते हैं, तो newजितना संभव हो उतना उपयोग करने का प्रयास करें ।
newऔर deleteC ++ प्राइमेटिव हैं जो एक वर्ग की नई आवृत्ति की घोषणा करते हैं या इसे हटाते हैं (इस प्रकार उदाहरण के लिए वर्ग के विनाशकर्ता को लागू करते हैं)।
mallocऔर freeसी फ़ंक्शन हैं और वे मेमोरी ब्लॉक (आकार में) आवंटित और मुक्त करते हैं।
दोनों आवंटन बनाने के लिए ढेर का उपयोग करते हैं। mallocऔर freeफिर भी अधिक "निम्न स्तर" के रूप में वे सिर्फ स्मृति स्थान का एक हिस्सा आरक्षित करते हैं जो संभवतः एक पॉइंटर के साथ जुड़ा होगा। उस मेमोरी के आसपास कोई संरचना नहीं बनाई जाती है (जब तक कि आप सी सरणी को एक संरचना नहीं मानते हैं)।
नए और हटाना c ++ में ऑपरेटर हैं; जिसे ओवरलोड भी किया जा सकता है। मॉलॉक और मुक्त सी में कार्य कर रहे हैं;
जब नया थ्रो अपवाद होता है तो मॉलॉक शून्य ptr देता है।
मॉलॉक द्वारा दिए गए पते को फिर से टाइप करके डाला जाना चाहिए क्योंकि यह (शून्य *) मॉलोक (आकार) वापस लौटाता है।
malloc(), हमें उस कार्यक्रम में शामिल होना चाहिए <stdlib.h> या
<alloc.h>जिसके लिए आवश्यक नहीं है new।newऔर deleteअतिभारित किया जा सकता है, लेकिन mallocनहीं किया जा सकता है।new, हम उस पते को पास कर सकते हैं जहां हम मेमोरी आवंटित करना चाहते हैं, लेकिन इसके मामले में यह संभव नहीं है malloc।alloc.hएक मानक हेडर नहीं है। <new>प्लेसमेंट नए का उपयोग करना आवश्यक है।
यह कोड डिलीट कीवर्ड या फ्री फंक्शन के उपयोग के लिए है। लेकिन जब 'मॉलॉक' या 'नई' का उपयोग कर एक पॉइंटर ऑब्जेक्ट बनाते हैं और डिलीट का उपयोग करके ऑब्जेक्ट मेमोरी को डील करते हैं तब भी ऑब्जेक्ट पॉइंटर को क्लास में कॉल फंक्शन हो सकता है। इसके बाद डिलीट के बजाय फ्री का उपयोग करें फिर यह भी फ्री स्टेटमेंट के बाद काम करता है, लेकिन जब दोनों तब केवल पॉइंटर ऑब्जेक्ट को क्लास में काम करने के लिए कॉल नहीं कर सकते .. कोड इस प्रकार है:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
आउटपुट:
Hello Hi 0x2abfef37cc20
1. कुछ सिंटेक्स मॉलॉक की तुलना में सरल है ()
2.new/delete एक ऑपरेटर है जहां मॉलोक () / मुक्त () एक फ़ंक्शन है।
3.new/delete मॉलोक () / मुक्त () की तुलना में तेज़ी से निष्पादित होता है क्योंकि कंपाइलर द्वारा सीधे नए असेंबल कोड को चिपकाया जाता है।
4. हम ऑपरेटर ओवरलैडिंग की मदद से प्रोग्राम में नया / डिलीट अर्थ बदल सकते हैं।