2010-04-29 4 views
6

में मॉलोक फ़ंक्शन मैं सी ++ में सी ++ में संक्रमण कर रहा हूं, क्या मॉलोक फ़ंक्शन के लिए कोई उपयोग है? या मैं इसे सिर्फ "नया" कीवर्ड के साथ घोषित कर सकता हूं। उदाहरण के लिए:सी ++

class Node 
{ 
    ... 
} 
... 
Node *node1 = malloc(sizeof(Node));  //malloc 
Node *node2 = new Node;     //new 

मुझे किस का उपयोग करना चाहिए?

+0

ध्यान दें कि सी ++ में शून्य * से कोई अंतर्निहित कलाकार नहीं है, इसलिए मॉलोक मामले पर आपको वास्तव में 'नोड * नोड 1 = reinterpret_cast (malloc (sizeof (नोड)) करने की आवश्यकता है, जो स्पष्ट रूप से बहुत अधिक टाइपिंग है। :) (ठीक है, आप सी-स्टाइल कास्ट भी कर सकते हैं, लेकिन फिर आप सी ++ में कोडिंग क्यों कर रहे हैं? :)) –

+5

सी से ++ को बहुत अधिक लागू न करने का प्रयास करें, वे अलग-अलग तरीकों से अलग-अलग भाषाओं के साथ अलग-अलग भाषाएं हैं। – GManNickG

उत्तर

20

new का उपयोग करें। आपको C12+ प्रोग्राम में malloc का उपयोग करने की आवश्यकता नहीं है, जब तक कि यह कुछ सी कोड के साथ सहभागिता नहीं कर रहा हो या आपके पास विशेष तरीके से स्मृति को प्रबंधित करने का कोई कारण हो।

node = malloc(sizeof(Node)) का आपका उदाहरण एक बुरा विचार है, क्योंकि Node के निर्माता (यदि कोई मौजूद है) के नाम से जाना नहीं होता है, और बाद में एक delete node; अपरिभाषित परिणाम होगा।

char *buffer = new char[1024]; 

, या, अधिमानतः कुछ इस तरह:

आप एक वस्तु बाइट्स की एक बफर के बजाय की जरूरत है, तो आप आम तौर पर कुछ इस तरह के लिए करना चाहेंगे

std::vector<char> buffer(1024); 

ध्यान दें कि दूसरे उदाहरण के लिए (std::vector<> का उपयोग करके), delete ऑब्जेक्ट की कोई आवश्यकता नहीं है; जब यह गुंजाइश से बाहर हो जाता है तो इसकी याददाश्त स्वचालित रूप से मुक्त हो जाएगी। आपको C++ प्रोग्राम्स में new और malloc दोनों से बचने के लिए प्रयास करना चाहिए, बजाय ऑब्जेक्ट्स का उपयोग करना जो स्वचालित रूप से अपनी स्मृति का प्रबंधन करते हैं।

+7

यदि आप अपने स्वयं के ऑपरेटर :: नए' के माध्यम से कस्टम मेमोरी आवंटन कर रहे हैं तो आप 'malloc' का भी उपयोग कर सकते हैं। – Troubadour

+1

और याद रखें कि नया विफलता पर std :: bad_alloc अपवाद फेंकता है जब तक कि नोट्रो संशोधक के साथ कॉल न करें! –

+1

शायद यह जोड़ना चाहिए कि नया नया प्रकार सुरक्षित है, जबकि मॉलोक से वापसी शून्य है *। – Joel

8

सी ++ में malloc() का सीधा समतुल्य operator new() है जो कच्ची मेमोरी आवंटित करता है, हालांकि ज्यादातर मामलों में new अभिव्यक्ति वह है जो आप चाहते हैं। new अभिव्यक्ति दोनों कच्ची मेमोरी की उचित मात्रा आवंटित करती है और उस ऑब्जेक्ट स्थान में किसी ऑब्जेक्ट को प्रारंभ करती है, जो नई ऑब्जेक्ट में सही ढंग से टाइप किए गए पॉइंटर को लौटाती है।

आपके मामले में, new Node सही है क्योंकि यह स्मृति आवंटित करता है और एक नया Node ऑब्जेक्ट प्रारंभ करता है। बस malloc पर कॉल करना और Node पर पॉइंटर को कास्टिंग परिणाम Node ऑब्जेक्ट का सही ढंग से निर्माण नहीं करेगा। यह महत्वपूर्ण है यदि Node एक पीओडी-स्ट्रक्चर नहीं है (उदाहरण के लिए जब यह या उसके उप-ऑब्जेक्ट्स में से एक को कन्स्ट्रक्टर होता है जिसे कॉल किया जाना चाहिए)।

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

2

ठीक है, एक बात जो मैं सोच सकता हूं, यदि आप नए उपयोग कर रहे हैं तो आप इसे फिर से शुरू करने के लिए रीयलोक को याद करने जा रहे हैं।

+3

'realloc' गैर-पीओडी प्रकारों के साथ काम नहीं करता है इसलिए 'वेक्टर' का उपयोग करके लगभग हमेशा सी ++ में पसंदीदा होता है। –

1

वे महत्वपूर्ण स्थिति जिसमें आपको malloc का उपयोग करना होगा, यदि मूल कोड कभी भी realloc पर कॉल करता है। बेशक आप सबकुछ आवश्यक कर सकते हैं, लेकिन ऐसा करने में इतना फायदा नहीं है।

+0

'realloc()' सी ++ में अक्सर बुरी खबर होती है, क्योंकि गैर-पीओडी डेटा ऑब्जेक्ट आमतौर पर मनमाने ढंग से स्थानांतरित होने के लिए एलर्जी होते हैं। इसके बजाए 'वेक्टर <>' का प्रयोग करें। यह न केवल आपके लिए स्मृति प्रबंधन करता है, यह सही ढंग से करता है। –

+0

सी कोड में जो मैं देखता हूं, लगभग हमेशा बाइट एरे या पॉइंटर सरणी पर उपयोग किया जाता है। दोनों पीओडी हैं। – Joshua

1

मेरी आदत आदिम प्रकारों और सी संगत structs के लिए malloc() का उपयोग करना है, और बाकी सब कुछ के लिए नया है।

3

new और malloc के बीच प्राथमिक अंतरों में से एक यह है कि new ऑब्जेक्ट के कन्स्ट्रक्टर को कॉल करेगा।

एक और अंतर यह है कि new एक अपवाद फेंक देगा (एक कंपाइलर pragma द्वारा अवरुद्ध किया जा सकता है) यदि स्मृति सफलतापूर्वक आवंटित नहीं की जा सकती है। malloc सिस्टम सिग्नल उत्पन्न होने का कारण बन सकता है। हालांकि malloc पर कॉल करके कुछ सी ++ पुस्तकालय new लागू करते हैं।

ऐसे कुछ उदाहरण हो सकते हैं जहां वस्तुओं को उनके रचनाकारों का आह्वान किए बिना गतिशील रूप से आवंटित करने की आवश्यकता हो। 20 से अधिक वर्षों में, मैं किसी भी नहीं आया (एम्बेडेड सिस्टम क्षेत्र में भी नहीं)।

1

सामान्य रूप से, new का उपयोग करें जब सी कोड के साथ इंटरफेसिंग करते हैं।

इस पर प्रमुख मुद्दा यह है कि क्या new साथ आवंटित किया जाता है delete साथ मुक्त कर दिया जाना चाहिए, और क्या malloc साथ आवंटित किया जाता है free साथ मुक्त कर दिया जाना चाहिए। आप new के साथ आवंटित नहीं कर सकते हैं और free() या इसके विपरीत के साथ मुक्त कर सकते हैं। तो, केवल एक बार आपको malloc की आवश्यकता होती है जब आपको कुछ सी कोड में डेटा पास करने की आवश्यकता होती है जो free() या realloc() हो सकती है।