क्या एसटीएल कार्यान्वयन हैं जो आवंटक के रूप में operator new[]
का उपयोग करते हैं? मेरे कंपाइलर पर, Foo::operator new[]
निजी बनाने से मुझे vector<Foo>
बनाने से रोका नहीं गया ... क्या यह व्यवहार किसी भी चीज़ द्वारा गारंटीकृत है?एसटीएल आवंटकों और ऑपरेटर नए []
उत्तर
सी ++ मानक, खंड 20.4.1.1। डिफ़ॉल्ट संभाजक आवंटित() फ़ंक्शन नई वैश्विक ऑपरेटर का उपयोग करता है:
pointer allocate(size_type n, allocator<void>::const_pointerhint=0);
3 Notes: Uses ::operator new(size_t) (18.4.1).
एसटीडी पुस्तकालय कार्यान्वयन टी का उपयोग नहीं होगा :: ऑपरेटर नई [] std :: संभाजक के लिए। उनमें से ज्यादातर दृश्यों के पीछे अपने स्वयं के मेमोरी पूलिंग इंफ्रास्ट्रक्चर का उपयोग करते हैं।
सामान्य रूप से, यदि आप गतिशील रूप से आवंटित Foo
वस्तुओं को रोकना चाहते हैं, तो आपको सभी रचनाकारों को निजी बनाना होगा और Foo
ऑब्जेक्ट्स बनाने वाले फ़ंक्शन प्रदान करना होगा। बेशक, आप उन्हें auto
वैरिएबल के रूप में बनाने में सक्षम नहीं होंगे।
में पूछने का सुझाव देता हूं कि वेक्टर मूल रूप से अनियमित स्मृति आवंटित करता है और बाद में जोड़े जाने पर वस्तुओं को स्थान देता है। स्मृति का संरक्षण उदाहरण नहीं बनाता है। – UncleBens
std :: वेक्टर एक आवंटक का उपयोग करता है जो टेम्पलेट तर्क के रूप में पारित होता है, जो std :: आवंटित करता है। आवंटक new[]
की तरह काम नहीं करता है - हालांकि यह केवल कच्ची मेमोरी आवंटित करता है, और प्लेसमेंट new
वास्तव में उस स्मृति में ऑब्जेक्ट्स बनाने के लिए उपयोग किया जाता है जब आप इसे ऑब्जेक्ट जोड़ने के लिए कहते हैं (उदा। push_back()
या resize()
के साथ)।
एक आवंटन में new[]
का उपयोग करने का एकमात्र तरीका यह होगा कि यदि आप चीजों का थोड़ा सा दुर्व्यवहार करते हैं, और new char[size];
जैसे कुछ का उपयोग करके कच्चे स्थान आवंटित किए जाते हैं। दुर्व्यवहार के रूप में, वह काफी हानिकारक है, लेकिन यह कक्षा के लिए new[]
के अपने अधिभार से अभी भी असंबंधित है।
यदि आप अपने ऑब्जेक्ट के निर्माण को प्रतिबंधित करना चाहते हैं तो operator new
के बजाय निजी कन्स्ट्रक्टर बनाएं।
अन्य उत्तर यहाँ के अलावा, अगर आप अपने प्रकार Foo
के लिए एक एसटीएल कंटेनर बनाने से किसी को भी रोकना चाहते हैं, तो बस कॉपी-निर्माता Foo
निजी (भी कदम-निर्माता के लिए बनाने के लिए यदि आप के साथ काम कर रहे हैं सी ++ 11)। सभी एसटीएल-कंटेनर ऑब्जेक्ट्स में कंटेनर के आवंटन के लिए कंटेनर के आवंटित मेमोरी ब्लॉक में ऑब्जेक्ट की प्रतिलिपि बनाने के लिए कंटेनर के आवंटक के लिए वैध प्रतिलिपि या चालक को स्थानांतरित करना चाहिए।
- 1. एसटीएल कम ऑपरेटर और "अमान्य ऑपरेटर <" त्रुटि
- 2. एसटीएल में कस्टम आवंटकों को केवल वास्तविक डेटा आवंटित करें?
- 3. नए या नई [] ऑपरेटर
- 4. सार्वजनिक ऑपरेटर नया, निजी ऑपरेटर हटाएं: नए
- 5. 'ऑपरेटर नए': परिभाषा, विभिन्न लिंकेज (नए सिरे से परिभाषित नए ऑपरेटर पर _dllspec का प्रयोग करके)
- 6. कुछ आवंटकों आलसी हैं?
- 7. सी ++: मेमोरी आवंटकों
- 8. सी # और जावा "नए" ऑपरेटर से परेशान क्यों हैं?
- 9. नए ऑपरेटर और क्लास.न्यू इंस्टेंस() के बीच क्या अंतर है?
- 10. सी ++ एसटीएल-अनुरूप ऑलोकेटर्स
- 11. एसटीएल कस्टम आवंटकों को विभिन्न मेमोरी रिक्त स्थान प्रबंधित करने के लिए
- 12. नए ऑपरेटर के लिए अनिर्धारित संदर्भ
- 13. नए
- 14. सी ++ यूनिकोड और एसटीएल
- 15. एसटीएल स्टैक और प्राथमिकता_क्यू
- 16. स्थिरांक और एसटीएल कंटेनर
- 17. आरएआईआई और सी ++ एसटीएल
- 18. कई आवंटकों का कुशलतापूर्वक उपयोग करना
- 19. सी ++ एसटीएल में एसटीएल
- 20. एसटीएल मानचित्रों के लिए [] ऑपरेटर कॉन्स क्यों नहीं है?
- 21. ऑपरेटर नया ओवरलोडिंग और संरेखण
- 22. सी ++ ऑपरेटर + और ऑपरेटर + = अधिभार
- 23. ऑपरेटर शून्य * और ऑपरेटर बूल
- 24. सी ++ एसटीएल सेट अंतर
- 25. एसटीएल?
- 26. एसटीएल
- 27. एसटीएल
- 28. एसटीएल
- 29. एसटीएल
- 30. एसटीएल
सी ++ मानक में ऐसा बयान नहीं मिला। आप किस संशोधन का उपयोग करते हैं? –
आईएसओ/आईईसी 14882: 1 99 8 (ई) –
यह 20.4.1.1 है, 24.4.1.1 नहीं, जो बता सकता है कि किरील को यह क्यों नहीं मिला। –