2012-03-07 9 views
11

< नई> शीर्षक में नए की परिभाषा है:मॉलोक को इसकी आवश्यकता होने के बावजूद नए को पॉइंटर को कास्ट की आवश्यकता क्यों नहीं है?

void* operator new(size_t); 

और malloc की परिभाषा में कहा गया है के रूप में किया जाता है:

void* malloc(size_t); 

अब, C++ एक जोरदार टाइप किया भाषा है, यह एक की आवश्यकता है प्रोग्रामर से एक शून्य * पॉइंटर को प्रोग्रामर के प्रकार के रूप में परिवर्तित करने के लिए डाला गया है ... मॉलोक में, हमें एक कलाकार करना है, लेकिन नए में नहीं, हालांकि दोनों एक शून्य * सूचक लौटाते हैं। क्यूं कर?

+0

इस चेक बाहर http://www.codeproject.com/Articles/6555/To-new-is-C-To-malloc -इस-सी-टू-मिक्स-इन-पाप - – pyCthon

+0

यह भी http://stackoverflow.com/questions/184537/in-what-cases-do-i-use-malloc-vs-new – pyCthon

+5

यह भी देखें : http://stackoverflow.com/q/1885849/1155650 –

उत्तर

12

क्योंकि जब आप new का उपयोग कर रहे हैं, तो आप (सामान्यतः) "नई अभिव्यक्ति" का उपयोग करते हैं, जो किसी ऑब्जेक्ट को आवंटित और प्रारंभ करता है। फिर आप उस ऑब्जेक्ट का पता उसी पॉइंटर को उसी ऑब्जेक्ट (या पैरेंट) प्रकार के ऑब्जेक्ट को असाइन कर रहे हैं, जिसे किसी कलाकार की आवश्यकता नहीं होती है। एक सामान्य नई अभिव्यक्ति (यानी, कोई प्लेसमेंट नया नहीं) आंतरिक रूप से operator new का आह्वान करेगा लेकिन नई अभिव्यक्ति का परिणाम केवल operator new से परिणाम होगा।

आप operator new सीधे आह्वान है, तो आप अपने परिणाम कास्ट करने के लिए एक गैर शून्य सूचक के लिए वापसी मान असाइन करना होगा, जैसा कि आप malloc से वापसी के साथ क्या करना है।

+1

क्या आप मुझे नई अभिव्यक्ति के बारे में और बता सकते हैं ???? – bhuwansahni

+2

स्वीकार किए गए [और शानदार :-)] इस प्रश्न का उत्तर देते हैं कि @Rohit लिंक इसके बारे में अधिक जानकारी में जाता है। –

5

क्योंकि आपके पास गलत प्रभाव है कि malloc का उपयोग कैसे करें। यह प्रकार को तर्क के रूप में प्राप्त नहीं करता है बल्कि केवल प्रकार का आकार प्राप्त करता है।

सी और सी ++ अलग-अलग भाषाएं हैं। सी में आपको malloc के void* को लक्ष्य सूचक प्रकार पर डालने की आवश्यकता नहीं है। C++ में new ऑपरेटर भाषा में गहराई से निर्माण करता है जैसे कि यह हमेशा तर्क में दिए गए प्रकार से संबंधित मान देता है।

नियम सी ++ और malloc सी के लिए new के लिए काफी सरल उपयोग है, उन्हें मिश्रण न करें।

+0

नए प्रकार को तर्क के रूप में कैसे प्राप्त करता है ?? – bhuwansahni

+1

@ बुहवानसनी, 'नया' एक ऑपरेटर नहीं है। जिस स्थान पर आप इसका उपयोग करते हैं, आप हमेशा इसे ऑब्जेक्ट का प्रकार देते हैं जिसे आवंटित और निर्माण किया जाना है। यह लिंक बनाने के लिए कंपाइलर पर निर्भर है। 'मॉलोक' के लिए कॉल के लिए सी में आप केवल आकार देते हैं। –

+0

हाँ लेकिन नए ऑपरेटर की घोषणा इसे प्रतिबिंबित नहीं करती है, क्यों ??? – bhuwansahni

1

क्योंकि operator new कॉल new का आह्वान करते समय पूरी श्रृंखला में केवल एक ही चरण उत्पन्न होता है।

जब आप s=new my_type(args); करते हैं, संकलक कि करने के लिए विस्तार होगा:

s = (my_type*)my_type.operator new(sizeof(my_type)); 
s.my_type(args); //Constructor call 
संबंधित मुद्दे