c++ रनटाइम पर गतिशील मेमोरी का सी++ आकार



memory dynamic (1)

जब कोई आवंटन किया जाता है, तो स्मृति के एक छोटे से हिस्से को तुरंत [या, तकनीकी रूप से, कहीं अलग तरह से, लेकिन सबसे आम परिदृश्य] से पहले आवंटन के आकार को संग्रहीत किया जाएगा, और new [] के मामले में भी new [] भी स्टोर करेगा आवंटित वस्तुओं की संख्या

ध्यान दें कि सी ++ मानक किसी कारण के लिए इस जानकारी को प्राप्त करने के लिए कोई रास्ता नहीं देता: उदाहरण के लिए, सरणी के आकार का सही वर्णन नहीं किया जा सकता है, उदाहरण के लिए एक सरणी के आकार को कुछ "अच्छी" सीमा तक लगभग ठीक किया जा सकता है [लगभग सभी आधुनिक आबंटक को बहुत कम से कम 16 बाइट्स पर गोल होता है, ताकि स्मृति एसएसई के लिए और अन्य प्रोसेसर आर्किटेक्चर पर इसी तरह के SIMD कार्यान्वयन के लिए उपयोग किया जा सके] इसलिए यदि आपने 40 बाइट्स को आवंटित किया है, तो यह 48 की रिपोर्ट करेगा, जो आपके लिए जो पूछा गया वह नहीं है, इसलिए यह भ्रामक होगा। और ज़ाहिर है, इसमें कोई गारंटी नहीं है कि सूचना को सब में संग्रहीत किया जाता है - यह किसी अन्य जानकारी से निरूपित किया जा सकता है जिसे आवंटन के "व्यवस्थापक" ब्लॉक में जमा किया जाता है।

और निश्चित रूप से, आप प्लेसमेंट new उपयोग कर सकते हैं, जिसमें कोई व्यवस्थापक ब्लॉक नहीं है, और सामान्य फ़ंक्शन में आवंटन को हटाया नहीं जाता है - कुछ मनमाना कोड अंतर नहीं बता पाएगा।

delete delete [] से अलग delete [] पता चलेगा कि कितने ऑब्जेक्ट को आवंटित किया गया है, और उन सभी वस्तुओं के लिए डिस्ट्रिक्टर को कॉल करें यह भी संभव है [या यहां तक ​​कि संभावना] कि new [] ऐसे तत्वों की संख्या को ऐसे तरीके से संग्रहीत करता है जिसका मतलब है कि किसी चीज़ पर कुछ को delete [] को delete [] बहुत गलत होगा।

और जैसा कि ज़ैन लिंक्स ने टिप्पणी की, यदि वस्तुओं के लिए कोई डिस्ट्रक्टर नहीं है (उदाहरण के लिए जब आप int या struct { int x; double y; } आदि के लिए डेटा आवंटित कर रहे हैं - ऐसे वर्गों सहित जिनमें कन्स्ट्रक्टर नहीं है [ध्यान दें कि यदि आपके पास क्लास के अंदर एक और वर्ग है, तो कंपाइलर आपके लिए एक डिस्ट्रक्टर बनाएगा]), तो गिन को स्टोर करने या कुछ और करने की कोई आवश्यकता नहीं है, इसलिए कंपाइलर CAN, यदि वह चाहती है, तो इस आवंटन को अनुकूलित करें नियमित रूप से new और delete

यह कुछ ऐसा है जो मैं थोड़ी देर के लिए सोच रहा था और कभी इसके लिए कोई जवाब नहीं मिला:

ऐसा क्यों है कि जब आप ढेर पर कुछ आवंटित करते हैं, तो आप इसे सिर्फ सूचक का आकार निर्धारित नहीं कर सकते हैं, फिर भी आप इसे सिर्फ पॉइंटर का उपयोग करके हटा सकते हैं और सी ++ जानता है कि कितने बाइट्स फ्री हैं?

क्या ढेर पर जिस तरह से इसे जमा किया जाता है उसके साथ ऐसा करने का क्या कुछ है? क्या यह जानकारी है लेकिन सी ++ द्वारा प्रकट नहीं हुई है?

और शायद यह एक अलग प्रश्न होना चाहिए, लेकिन मुझे लगता है कि यह बहुत सुंदर है इसलिए मैं इसे यहां पूछूंगा:

ऐसा क्यों है कि सरल delete आदेश के विरोध में तत्वों का डायरेक्टिव सरणी हटाए जाने के द्वारा नष्ट कर दिया जाना चाहिए; सी ++ को अतिरिक्त मेमोरी को सही तरीके से मुक्त करने के लिए इस अतिरिक्त जानकारी की आवश्यकता क्यों है?





allocation