2016-07-05 7 views
23

stl_construct.h निम्नलिखित कार्य है का उपयोग करें:लाभ डाली सूचक शून्य करने के लिए * जब नए

template<typename _T1, typename _T2> 
inline void 
_Construct(_T1* __p, const _T2& __value) 
{ 
    ::new(static_cast<void*>(__p)) _T1(__value); 
} 

मुझे पता है क्यों कास्टिंग void* को __p की जरूरत है चाहता हूँ, वहाँ किसी भी लाभ है?

+3

सुनिश्चित नहीं है, लेकिन यह दावा करता है कि '__p' एक सूचक है जिसका उपयोग प्लेसमेंट के लिए किया जा सकता है? –

+9

मेरे द्वारा सामना किए गए आंतरिक लाइब्रेरी कोड को पढ़ने का खतरा यह है कि (नया) प्रोग्रामर * अपने स्वयं के कोड में * आंतरिक * का उपयोग शुरू करता है (नहीं, मैं मजाक नहीं कर रहा हूं - मैंने इसे कुछ कोड में देखा है)। – PaulMcKenzie

उत्तर

24

यह गारंटी देता है कि पूर्व निर्धारित नियुक्ति नए ऑपरेटर कहा जाता है, बजाय किसी भी अधिभार हस्ताक्षर void* operator new(std::size_t, _T1*) साथ उपयोगकर्ता कोड से वैश्विक नामस्थान को जोड़ा गया ।

3

यह सुनिश्चित एक संभावित _T1 * डाली ऑपरेटर unitentionally निष्पादित नहीं हो जाता है

+1

क्या ऐसा होने पर आप एक साधारण उदाहरण प्रदान कर सकते हैं? यह प्लेसमेंट निर्माण की तरह दिखता है, इसलिए पॉइंटर के पास बफर के समान संरेखण होना चाहिए, आमतौर पर 'alignof (char */void *) '। – vsoftco

+0

ब्रायन के उत्तर के मामले में, केवल उस * के लिए प्रदान किए गए एक के बजाय, अंतर्निहित रूपांतरण के माध्यम से * ओवरलोडेड 'नया' पाता है। –

2

यह सुनिश्चित करता है कि कोई भी void* operator new(size_t, _T1*); प्लेसमेंट के रास्ते में नहीं मिलता है जो इसे करने का प्रयास कर रहा है।

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