2013-09-25 4 views
6

कृपया ध्यान दें कि यह प्रश्न C12+ में malloc बनाम new/स्मार्ट पॉइंटर्स में malloc पर नहीं है।मुझे सी ++ में मॉलोक का परिणाम कैसे डालना चाहिए?

यदि मैं सी ++ में malloc का उपयोग करता हूं, तो मुझे किस तरह का कलाकार उपयोग करना चाहिए? निम्नलिखित सभी काम।

int *a = (int *)malloc(sizeof (int)); 
int *b = static_cast<int *>(malloc(sizeof (int))); 
int *c = reinterpret_cast<int *>(malloc(sizeof (int))); 

लाइव उदाहरण: http://ideone.com/lzfxcm

मैं सी का उपयोग करना पसंद ++ शैली मेरी कोड जितना संभव हो उतना में डाले और मैं सुरक्षित कोडिंग की आदतों को अपनाना चाहते हैं। कृपया इसे ध्यान में रखें।

धन्यवाद।

+0

, एक सी शैली डाली reintprerpt_cast से कम नहीं सुरक्षित है। – tenfour

+4

सुरक्षित होने के लिए आपको नए का उपयोग करना चाहिए और malloc –

+1

@claptrap I विशेष रूप से यह प्रश्न नहीं है कि यह सवाल malloc बनाम नया है। कभी-कभी malloc का उपयोग C++ में किया जाता है। हो जाता है। –

उत्तर

14

malloc के बाद से void के लिए सूचक देता है, वहाँ एक सी ++ उपयोग करने के लिए कोई कारण नहीं है - सूचक पर शैली डाली: यदि आप इसके पीछे कोई संरचना के साथ, कच्चे स्मृति का एक हिस्सा मिलता है, तो केवल एक ही चीज़ अपने संकलक बता सकते हैं एक कलाकार जोड़कर यह है कि आप इस स्मृति को किसी विशेष प्रकार के डेटा के लिए उपयोग करने की योजना बना रहे हैं। कंपाइलर उस पर आपके साथ सहमत होना चाहिए, क्योंकि इसमें आपके निर्णय को दोबारा जांचने के लिए कोई अतिरिक्त जानकारी नहीं है। न तो static_cast<T> और न ही reinterpret_cast<T> सी-स्टाइल कास्ट पर एक विशेष लाभ प्रदान करते हैं, और सी-स्टाइल कास्ट छोटा है।

व्यक्तिगत परिप्रेक्ष्य से, मैंने बहुत सारे सी ++ कोड को देखा, लेकिन मैंने कभी भी सी ++ - स्टाइल कास्ट कभी नहीं देखा है, जिसमें malloc, केवल सी-शैली है।

+1

सभी 'मॉलोक' सी के बाद सी है! सी ++ में 'नया' है। –

6

मैं static_cast का उपयोग करना पसंद करूंगा, जैसा कि आप कर रहे हैं, void* किसी अन्य ऑब्जेक्ट प्रकार के पॉइंटर में कनवर्ट करना है, जिसे सी ++ में अच्छी तरह से परिभाषित किया गया है।

सी-शैली कास्ट सी ++ में उपयोग नहीं किया जाना चाहिए, क्योंकि संकलक किसी भी प्रकार की जांच नहीं करेगा - सी-स्टाइल कास्ट का उपयोग करके, आप सभी प्रकार की सुरक्षा खो देते हैं। विचार है कि अपने जानवरों को केवल वही चीज़ों को सीमित करना है जो आवश्यक हैं और नहीं।

reinterpret_cast का एक अलग उद्देश्य है - किसी ऑब्जेक्ट के बिट्स को किसी अन्य प्रकार के रूप में दोबारा परिभाषित करने के लिए। void कोई ऑब्जेक्ट नहीं है, इसलिए यह स्पष्ट रूप से void*/malloc पर लागू नहीं होता है।

+0

(+1) मैं एक समान उत्तर पोस्ट करने वाला था :-) यह एक [प्रासंगिक लिंक] है (http://stackoverflow.com/a/7970036/2633423) SO पर। –

+1

'सी-शैली कास्ट सी ++ में उपयोग नहीं किया जाना चाहिए' इससे बेहतर औचित्य होना चाहिए, या कोई नहीं है? – dmitri

+1

@dmitri: मैंने अपना जवाब अपडेट कर लिया है। इसके अलावा, मैं एक सी ++ purist हूँ। –

2

"कम से कम हिंसक" कास्ट हमेशा उपयोग करने के सिद्धांत के साथ चिपके हुए, मैं static_cast की सिफारिश करता हूं।

हालांकि, और भी बेहतर की तरह

template <typename T> 
T* mnew(std::size_t count = 1) 
{ 
    return static_cast<T*>(malloc(sizeof(T) * count)); 
} 
+0

आप इस फ़ंक्शन का उपयोग क्यों करेंगे, न केवल 'ऑपरेटर नया'? – tenfour

+4

क्योंकि यह (1) त्रुटियों के मामले में नए हैंडलर को कॉल करने और/या 'std :: bad_alloc' फेंकने के बजाय 'NULL 'देता है, (2) लौटा हुआ सूचक'' '(' '' ' हटाएं [] 'या 'हटाएं' और (3) यह किसी भी निर्माता को कॉल नहीं करता है। – Oberon

0

malloc एक आवरण समारोह होगा शून्य रिटर्न * सूचक आप सी शैली डाले का उपयोग कर किसी भी वांछित सूचक करने के लिए इसे डाल सकता लेकिन सी ++ शुरू की 4 नए कलाकारों ऑपरेटर एक नुकसान से उबरने के लिए जो सी शैली के साथ घिरा हुआ है और यह है कि वे आसानी से आईडीई या grep जैसे किसी भी अन्य उपकरण का उपयोग नहीं कर सकते हैं।

विचार के अपने उदाहरण

int *a = (int *)malloc(sizeof (int)); 
int *b = static_cast<int *>(malloc(sizeof (int))); 
int *c = reinterpret_cast<int *>(malloc(sizeof (int))); 

यहाँ आप आसानी से static_cast या reinterpret_cast के सभी उदाहरणों की खोज कर सकते हैं, लेकिन यह सी शैली डाली होता तो आप लेकिन कोई दूसरा रास्ता नहीं बस देख सकते हैं या कोड में खुदाई करने के लिए मिला है और नींद हराम खर्च रातों। मेरा मानना ​​है कि कास्टिंग बग बहुत कठिन हैं और उन्होंने सी और सी ++ शैली भाषाओं द्वारा दी गई मजबूत टाइपिंग गारंटी को कमजोर कर दिया है। लेकिन उनके कुछ वास्तविक मामले हैं जहां ऐसी कलाकारों की आवश्यकता है।

इसलिए सी ++ सी शैली कास्टिंग की अनुमति देता है लेकिन यह reinterpret_cast ऑपरेटर intoduce है जो सी शैली कास्ट ऑपरेशन के अलावा कुछ भी नहीं करता है।

http://www.stroustrup.com/bs_faq2.html#void-ptr

malloc के लिए
संबंधित मुद्दे