2012-08-12 21 views
9

साक्षात्कार प्रश्न: "नया" ऑपरेटर और "नया" फ़ंक्शन के बीच क्या अंतर है?"नया" ऑपरेटर और "नया" फ़ंक्शन

मैंने उत्तर दिया कि कोई अंतर नहीं है, कि वे एक ही कोड चलाते हैं, लेकिन साक्षात्कारकर्ता ने मुझे परेशान रखा जैसे कि यह गलत जवाब था।

क्या यह गलत उत्तर है? या साक्षात्कारकर्ता सिर्फ मेरे साथ खेल खेल रहा था?

यदि यह गलत जवाब है, तो सही जवाब क्या है?

मैंने जारी रखा कि यदि आपको कस्टम आवंटन की आवश्यकता होती है तो "नया" ऑपरेटर ओवरलोड हो सकता है, लेकिन फिर वह को अधिभारित करने के लिए कैसे जानना चाहता था। बेशक मेरे पास यह जवाब नहीं था, जिसकी आवश्यकता कभी नहीं थी, लेकिन मैंने उसे बताया कि मैं इसे 10 मिनट में देख सकता हूं (जो कभी साक्षात्कार में सही उत्तर नहीं है)।

तो किसी भी तरह, "नया" ऑपरेटर बनाम "नया" फ़ंक्शन पर कुछ शोध किया है और कोई वास्तव में संतोषजनक उत्तर नहीं देख रहा है, मैंने सोचा कि मैं विशिष्ट प्रश्न पूछूंगा।

+3

नया फ़ंक्शन क्या है? मैंने मानक सी ++ में ऐसे फ़ंक्शन के बारे में कभी नहीं सुना है (ध्यान दें कि मैं सी ++ लड़का नहीं हूं)। –

+0

नया * फ़ंक्शन * है जिसे आप * ऑपरेटर * नया जैसा ही कहते हैं? आमतौर पर इसे क्या कहा जाता है, और इसे उत्तर के लिए Google की सहायता करनी चाहिए। –

+3

शायद नए ऑपरेटर और ऑपरेटर के बीच नया सवाल था। http://stackoverflow.com/questions/1885849/difference-between- new-operator-and-operator- नया। – Heisenbug

उत्तर

1
मूल रूप से

: - समारोह: "ऑपरेटर नई '

class Example 
{ public: 
     void* operator new(size_t); 
} 

" नए ऑपरेटर ":

Example* eg = new Example(); 
1

मैं जारी रखा है कि' नई 'ऑपरेटर अतिभारित किया जा सकता है अगर आप जरूरत एक कस्टम आवंटन

यो तुम लगभग सही हो new ऑपरेटर के लिए एक कीवर्ड है, जिसका उपयोग स्मृति आवंटन के लिए किया जाता है।

यह एक ऑपरेटर क्यों है?
आवश्यकता के आधार पर, इसे दोनों वैश्विक दायरे या कक्षा के दायरे पर ओवरलोड किया जा सकता है (लेकिन namespace स्कोप नहीं है!)। यदि यह एक समारोह था तो यह संभव नहीं होता।

0

अंतर यह है कि वे कैसे कार्य करते हैं। शुरुआती आवंटन हिस्सा प्रति मानक मानते हैं, वही। यही है, सिंटैक्स का उपयोग कर बनाम नया बनाम ऑपरेटर नया() स्पष्ट रूप से वही है। अंतर, नया उपयोग शुरू कर रहा है या नई वस्तु का निर्माण करता है। :: ऑपरेटर न्यू() के 3 अलग-अलग संस्करण भी हैं और इनका उपयोग करने के लिए विभिन्न वाक्यविन्यास भी हैं (यानी, प्लेसमेंट नया)।

0

कोई नया कार्य नहीं है। मेरा अनुमान है कि वे तुम्हें कहना है कि इनमें से किसी एक स्मृति आवंटित (मानक संभाजक समारोह, समारोह नया ऑपरेटर और इसके लिए नए ऑपरेटर का उपयोग करता है) और अन्य पहली बार इस्तेमाल किया स्मृति को आबंटित करने कि, तो चाहता था है निर्माता (मानक नई अभिव्यक्ति उपयोग करता है) और deallocator समारोह कहा जाता है, तो निर्माता एक अपवाद के साथ बाहर निकल गया स्मृति को मुक्त करने (उर्फ समारोह ऑपरेटर को नष्ट या ऑपरेटर हटाना)।

16

new ऑपरेटर और operator new समान नहीं हैं।

new ऑपरेटर स्मृति को आबंटित करने के लिए एक operator new फ़ंक्शन को कॉल करने, और फिर, प्रकार आवंटित और इस्तेमाल वाक्य रचना, पर निर्भर करता है initializes या आबंटित स्मृति पर एक निर्माता कहता है। दूसरे शब्दों में, operator newnew ऑपरेटर के संचालन का केवल एक हिस्सा है।

operator newnew ऑपरेटर द्वारा स्मृति आवंटित करने के लिए बुलाया गया फ़ंक्शन है। operator new का एक डिफ़ॉल्ट कार्यान्वयन है जो को प्रतिस्थापित कर सकता है, जो अधिभार के समान नहीं है। operator new को a particular type के लिए भी उस प्रकार की ऑब्जेक्ट्स के आवंटन को संभालने के लिए लागू किया जा सकता है, या operator new ओवरलोड हो सकता है और new ऑपरेटर के प्लेसमेंट के नए रूप का उपयोग करके अधिभार का चयन किया जा सकता है।

void operator delete(void* ptr) noexcept; 
void operator delete(void* ptr, const std::nothrow_t&) noexcept; 
void operator delete[](void* ptr) noexcept; 
void operator delete[](void* ptr, const std::nothrow_t&) noexcept; 

:

void *operator new(std::size_t size); 
void *operator new(std::size_t size, const std::nothrow_t&); 
void *operator new[](std::size_t size); 
void *operator new[](std::size_t size, const std::nothrow_t&); 

जब आप operator new के लिए एक स्थानापन्न या अधिभार प्रदान आप इसी operator delete कार्यों प्रदान करना चाहिए:

operator new के डिफ़ॉल्ट कार्यान्वयन निम्नलिखित हस्ताक्षरों के साथ कार्यों को परिभाषित करते हुए बदला जा सकता है new ऑपरेटर के प्लेसमेंट फॉर्म के उपयोग के लिए operator new का अधिभार प्रदान करने के लिए आप अतिरिक्त जोड़ सकते हैं तर्क (operator new और operator delete के नोट्रो संस्करण इसे करें)।

struct my_type {}; 

void *operator new(std::size_t size, const my_type&); 
void operator delete(void *ptr, const my_type&); 

new (my_type()) int(10); // allocate an int using the operator new that takes a my_type object 

delete ऑपरेटर का कोई 'प्लेसमेंट डिलीट' फॉर्म नहीं है। operator delete का ओवरलोड प्रदान किया गया है क्योंकि यदि स्मृति के प्रारंभ/निर्माण के दौरान कोई त्रुटि होती है (उदाहरण के लिए, ऑपरेटर द्वारा operator new के बाद ऑपरेटर कहा जाता है) संबंधित operator delete कहा जाता है कि यह अपवाद को फिर से फेंकने से पहले मौजूद है या नहीं। अन्यथा operator delete को अपवाद नहीं दिया जाता है और the memory leaks नहीं कहा जाता है।

संबंधित मुद्दे