2009-12-08 20 views
5

क्या एसटीएल कार्यान्वयन हैं जो आवंटक के रूप में operator new[] का उपयोग करते हैं? मेरे कंपाइलर पर, Foo::operator new[] निजी बनाने से मुझे vector<Foo> बनाने से रोका नहीं गया ... क्या यह व्यवहार किसी भी चीज़ द्वारा गारंटीकृत है?एसटीएल आवंटकों और ऑपरेटर नए []

उत्तर

4

सी ++ मानक, खंड 20.4.1.1। डिफ़ॉल्ट संभाजक आवंटित() फ़ंक्शन नई वैश्विक ऑपरेटर का उपयोग करता है:

pointer allocate(size_type n, allocator<void>::const_pointerhint=0); 

3 Notes: Uses ::operator new(size_t) (18.4.1). 
+0

सी ++ मानक में ऐसा बयान नहीं मिला। आप किस संशोधन का उपयोग करते हैं? –

+0

आईएसओ/आईईसी 14882: 1 99 8 (ई) –

+1

यह 20.4.1.1 है, 24.4.1.1 नहीं, जो बता सकता है कि किरील को यह क्यों नहीं मिला। –

2

एसटीडी पुस्तकालय कार्यान्वयन टी का उपयोग नहीं होगा :: ऑपरेटर नई [] std :: संभाजक के लिए। उनमें से ज्यादातर दृश्यों के पीछे अपने स्वयं के मेमोरी पूलिंग इंफ्रास्ट्रक्चर का उपयोग करते हैं।

सामान्य रूप से, यदि आप गतिशील रूप से आवंटित Foo वस्तुओं को रोकना चाहते हैं, तो आपको सभी रचनाकारों को निजी बनाना होगा और Foo ऑब्जेक्ट्स बनाने वाले फ़ंक्शन प्रदान करना होगा। बेशक, आप उन्हें auto वैरिएबल के रूप में बनाने में सक्षम नहीं होंगे।

+2

में पूछने का सुझाव देता हूं कि वेक्टर मूल रूप से अनियमित स्मृति आवंटित करता है और बाद में जोड़े जाने पर वस्तुओं को स्थान देता है। स्मृति का संरक्षण उदाहरण नहीं बनाता है। – UncleBens

2

std :: वेक्टर एक आवंटक का उपयोग करता है जो टेम्पलेट तर्क के रूप में पारित होता है, जो std :: आवंटित करता है। आवंटक new[] की तरह काम नहीं करता है - हालांकि यह केवल कच्ची मेमोरी आवंटित करता है, और प्लेसमेंट new वास्तव में उस स्मृति में ऑब्जेक्ट्स बनाने के लिए उपयोग किया जाता है जब आप इसे ऑब्जेक्ट जोड़ने के लिए कहते हैं (उदा। push_back() या resize() के साथ)।

एक आवंटन में new[] का उपयोग करने का एकमात्र तरीका यह होगा कि यदि आप चीजों का थोड़ा सा दुर्व्यवहार करते हैं, और new char[size]; जैसे कुछ का उपयोग करके कच्चे स्थान आवंटित किए जाते हैं। दुर्व्यवहार के रूप में, वह काफी हानिकारक है, लेकिन यह कक्षा के लिए new[] के अपने अधिभार से अभी भी असंबंधित है।

0

यदि आप अपने ऑब्जेक्ट के निर्माण को प्रतिबंधित करना चाहते हैं तो operator new के बजाय निजी कन्स्ट्रक्टर बनाएं।

0

अन्य उत्तर यहाँ के अलावा, अगर आप अपने प्रकार Foo के लिए एक एसटीएल कंटेनर बनाने से किसी को भी रोकना चाहते हैं, तो बस कॉपी-निर्माता Foo निजी (भी कदम-निर्माता के लिए बनाने के लिए यदि आप के साथ काम कर रहे हैं सी ++ 11)। सभी एसटीएल-कंटेनर ऑब्जेक्ट्स में कंटेनर के आवंटन के लिए कंटेनर के आवंटित मेमोरी ब्लॉक में ऑब्जेक्ट की प्रतिलिपि बनाने के लिए कंटेनर के आवंटक के लिए वैध प्रतिलिपि या चालक को स्थानांतरित करना चाहिए।

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