2009-07-02 2 views
8

में स्मृति आवंटन क्या "नया" ऑपरेटर का उपयोग करके मनमाने ढंग से स्मृति ब्लॉक आवंटित करना संभव है? सी में मैं इसे "शून्य * पी = malloc (7) की तरह कर सकते हैं;" - अगर स्मृति संरेखण 1 बाइट पर सेट किया गया है तो यह 7 बाइट आवंटित करेगा। नए ऑपरेटर के साथ सी ++ में इसे कैसे बनाया जाए?सी ++

उत्तर

43

मनमाने ढंग से स्मृति ब्लॉक को C12+ में operator new के साथ आवंटित किया जा सकता है; new ऑपरेटर के साथ नहीं जो ऑब्जेक्ट्स बनाने के लिए है।

void* pBlock = ::operator new(7); 

ऐसे ब्लॉक बाद में operator delete से मुक्त हो सकते हैं।

::operator delete(pBlock); 

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

+7

+1 का उल्लेख करने के लिए +1 * है * इसे मॉलोक और फ्री के बिना करने का एक तरीका है :) –

+1

इसके अलावा, जागरूक रहें कि ऑपरेटर नया आम तौर पर केवल मॉलोक() के लिए हिरण को पास करता है (हर कार्यान्वयन पर मुझे पता है)। जैसा कि प्रमुख कहा जाता है, साथ ही मॉलोक का भी उपयोग कर सकते हैं। –

+1

बहुत बहुत धन्यवाद। यह एक जवाब है (":: ऑपरेटर नया")। मैंने यह पता लगाने की कोशिश की कि ":: नया (एक्स);" काम नहीं करता :) – user132349

8

आप सी ++ के ऑपरेटर new के साथ एक void सूचक आवंटित नहीं कर सकता:

char *p = new char[7]; 
uint8_t *q = new uint8_t[7]; 
... 
delete [] p; 
delete [] q; 
2

मुझे लगता है कि आप Placement New की तलाश में हो सकता है: यदि आप एक स्पष्ट प्रकार जैसे char या uint8_t आवंटित करने के लिए होगा।

+1

मैं केवल इतना जोड़ूंगा कि यदि आप नियुक्ति के रूप में ऐसी तकनीकों का उपयोग करने जा रहे हैं तो आपको सावधान रहना होगा। वास्तव में अगर आवश्यक हो तो इसका इस्तेमाल करें !! –

+5

प्लेसमेंट नए आवंटन को कैसे आवंटित करता है? – avakar

+0

@ मिकी डी: मैं सहमत हूं, यही कारण है कि लिंक किए गए पृष्ठ को सभी कैप्स में "डेंजर" शब्द के साथ छिड़क दिया जाता है। :-) –

2

नया चार [7];

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

+5

कोई फर्क नहीं पड़ता; एक चार सबसे छोटा प्रकार कार्यान्वयन संभाल सकता है। यदि एक char 16 बिट्स है, तो एक बाइट प्रकार 16 बिट से कम नहीं हो सकता है। याद रखें कि आकार (char) == 1. हमेशा। –

+0

@ डेविड थॉर्नले: आकार (चार) आवश्यक नहीं है 1, अन्यथा मार्शलिंग पुस्तकालयों के सभी प्रकार बहुत परेशान हो जाएंगे। – florin

+1

@florin: sizeof (char) == 1 मानक के अनुसार। आईएसओ/आईईसी 14882: 2003 की धारा 5.3.3 देखें। "sizeof (char), sizeof (हस्ताक्षरित char) और sizeof (unsigned char) 1 हैं; किसी अन्य मौलिक प्रकार (3.9.1) पर लागू आकार का परिणाम कार्यान्वयन-परिभाषित है।" –

2

आप char* pBuffer = new char[7]; कर सकते हैं, और आकार (char) 1 बाइट है, इसलिए आप इसे बाइट बफर के रूप में उपयोग कर सकते हैं। साथ ही, स्मृति जारी करते समय delete[] ([] के साथ) का उपयोग करना याद रखें।

11

अन्य ने इस प्रश्न का उत्तर लिखे हैं, लेकिन मैं इस तरह के आवंटन के लिए मॉलोक/मुफ्त के साथ चिपकने का सुझाव देना चाहता हूं।

नई और हटाएं ऑब्जेक्ट आवंटित करने के लिए हैं। वे आवश्यक स्मृति आवंटित करते हैं और कन्स्ट्रक्टर/विनाशकों को कॉल करते हैं। यदि आप जानते हैं कि आपको स्मृति की मनमानी ब्लॉक की आवश्यकता है, तो मॉलोक और फ्री का उपयोग करके पूरी तरह से उचित है।

+1

लेकिन यदि आप सी ++ कोड लिख रहे हैं तो मुझे लगता है कि नए/डिलीट का उपयोग करना बेहतर है क्योंकि आप ऑब्जेक्ट आवंटित करने के लिए इसका उपयोग करेंगे। दो प्रकार के मेमोरी आवंटन कार्यों में भ्रम पैदा होता है। – Naveen

+1

-1। नई/हटाएं भाषा संरचनाएं हैं और टाइप सुरक्षा को लागू करें चाहे आप आवंटित/अस्वीकार करें। malloc/मुक्त पिछली संगतता के लिए कलाकृतियों शेष हैं। – sharkin

+1

@RA, अगर किसी को बाइट्स के मनमाने ढंग से जेनेरिक ब्लॉक की आवश्यकता है, तो विश्वास करने में कोई लाभ नहीं है कि वे विशेष रूप से चार या हस्ताक्षरित चार या जो कुछ भी हैं - एक शून्य * अधिक ईमानदार और स्पष्ट है। मॉलोक के लिए +1! –

3

हाँ आप कर सकते हैं।
लेकिन आप जो कर रहे हैं उसके आधार पर बेहतर तकनीकें हो सकती हैं।

क्या आप सवाल अपडेट कर सकते हैं और हमें बता सकते हैं कि आप क्या हासिल करने की कोशिश कर रहे हैं। अधिक संदर्भ के साथ एक बेहतर समाधान प्रदान किया जा सकता है।

एक उदाहरण:
यदि आप गतिशील रूप से सॉकेट से पढ़ने के लिए बफर आवंटित कर रहे थे (क्योंकि आकार संकलन समय पर ज्ञात नहीं है)। एक विकल्प वेक्टर और गतिशील आकार का उपयोग करना होगा। फिर आप पहले तत्व के पते को लेकर बफर के अंदर एक सूचक प्राप्त कर सकते हैं।

3

व्यक्तिगत रूप से मैं std::vector<char> का उपयोग करूंगा। न केवल आपको बाइट्स (guaranteed to be contiguous) का मनमाना ब्लॉक मिलता है, आप उन्हें एक रैली रैपर में ले जाते हैं।बेशक, (, से हो सकता है, resize() अलग) std::vector के किसी तरीके को इस्तेमाल करने की कोई जरूरत नहीं है, लेकिन उसके लिए कोई जुर्माना है:

std::vector<char> buffer(7); 
void* p = &buffer[0]; 

आप एक std::string इस्तेमाल कर सकते हैं, लेकिन std::string का तात्पर्य "इस वस्तु शामिल मुद्रित होने पर समझने वाले वर्ण, "जहां std::vector<char> का अर्थ है" इस ऑब्जेक्ट में बाइट्स का मनमाना समूह है। "