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
/ delete
C ++ है, 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
और delete
C ++ प्राइमेटिव हैं जो एक वर्ग की नई आवृत्ति की घोषणा करते हैं या इसे हटाते हैं (इस प्रकार उदाहरण के लिए वर्ग के विनाशकर्ता को लागू करते हैं)।
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. हम ऑपरेटर ओवरलैडिंग की मदद से प्रोग्राम में नया / डिलीट अर्थ बदल सकते हैं।