दिलचस्प पोस्ट
जावा क्लास के विकल्प (उदाहरण के लिए इंटरफेस के बजाय) अमूर्त वर्गों के प्रॉक्सी बनाने के लिए प्रोक्सी लचीले बॉक्स मॉडल – प्रदर्शन: फ्लेक्स, बॉक्स, फ्लेक्सबॉक्स? हाइबरनेट बनाम जेपीए बनाम जेडीओ – पेशेवरों और प्रत्येक के विचार? सी प्रीप्रोसेसर: स्ट्रिंग के लिए एक्सटेक्ट इंट रिलेशनल डेटाबेस में आईपीवी 6-संगत पते को कैसे स्टोर करना है मेनूइटम शॉर्टकट को परिभाषित करना इससे पहले कि वह वापस लौटाए, मैं AJAX कॉल को समाप्त करने के लिए jQuery का इंतजार कैसे करूं? एचटीएमएलएक्स वीडियो: बफरिंग का बल निरस्त करना फ़ाइल या विधानसभा को लोड नहीं किया जा सका 'System.Web.Mvc' माउस पॉइंटर को एक विशिष्ट स्थिति में ले जाएं? क्या सूचक (पता) कभी नकारात्मक हो सकता है? सी # टेलनेट लाइब्रेरी सामग्री स्थानांतरण-एन्कोडिंग एक HTTP हेडर है? Android 3.0.1 के लिए WebView में फ्लैश वीडियो प्रदर्शित नहीं किया जा रहा है ज़िंककोड को परिवर्तित करें या काउंटी के लिए लेट / लाँग करें

कैसे ऑपरेटर सरणी के आकार को "पता" करता है?

Foo* set = new Foo[100]; // ... delete [] set; 

आप delete[] को delete[] के लिए सरणी की सीमाओं को पार नहीं करते हैं लेकिन यह जानकारी कहां संग्रहीत है? क्या यह मानकीकृत है?

Solutions Collecting From Web of "कैसे ऑपरेटर सरणी के आकार को "पता" करता है?"

जब आप मेप पर मेमोरी आवंटित करते हैं, तो आपका ऑलोकेटर आपके पास आवंटित कितनी स्मृति का ट्रैक रखेगा। यह आमतौर पर स्मृति के ठीक पहले "सिर" सेगमेंट में संग्रहीत होता है जिसे आपको आवंटित किया जाता है इस तरह जब यह स्मृति को मुक्त करने का समय है, तो डी-ऑलोकेटर जानता है कि मुफ्त में कितना मेमोरी है

कंपाइलर के लिए एक दृष्टिकोण थोड़ा और स्मृति आवंटित करना है और एक प्रमुख तत्व में तत्वों की गिनती को संग्रहित करना है।

उदाहरण कैसे किया जा सकता है:

यहाँ

 int* i = new int[4]; 

संकलक sizeof(int)*5 बाइट आवंटित करेगा।

 int *temp = malloc(sizeof(int)*5) 

पहले sizeof(int) बाइट्स में "4" स्टोर करेगा

 *temp = 4; 

और i सेट

 i = temp + 1; 

इसलिए i 4 तत्वों की एक सरणी को इंगित करेगा, न कि 5

और हटाना

 delete[] i; 

निम्नलिखित तरीके से संसाधित किया जाएगा:

 int *temp = i - 1; int numbers_of_element = *temp; // = 4 ... call destructor for numbers_of_element elements ... that are stored in temp + 1, temp + 2, ... temp + 4 if needed free (temp) 

जानकारी मानकीकृत नहीं है हालांकि मैंने इस जानकारी पर काम करने वाले प्लेटफार्मों में पहले तत्व से पहले स्मृति में संग्रहीत किया जाता है। इसलिए आप सैद्धांतिक रूप से इसका उपयोग कर सकते हैं और इसका निरीक्षण कर सकते हैं, हालांकि यह इसके लायक नहीं है।

इसके अलावा यही कारण है कि जब आप नई [] के साथ मेमोरी आवंटित करते हैं, तब आपको हटाना चाहिए [], क्योंकि हटाए जाने के सरणी संस्करण को जानता है कि (और जहां) उसे सही मात्रा की मात्रा को मुक्त करने की आवश्यकता है – और उचित संख्या में नाशकों को कॉल करें वस्तुओं के लिए

मूल रूप से इसकी स्मृति में व्यवस्था की गई है:

[जानकारी] [मे आपने पूछा …]

जहां जानकारी आपके कम्पाइलर द्वारा उपयोग की जाने वाली संरचना को आवंटित स्मृति की मात्रा को संग्रहीत करने के लिए है, और क्या नहीं।

यह कार्यान्वयन हालांकि निर्भर है।

यह ऐसा कुछ नहीं है जो कल्पना में है – यह कार्यान्वयन निर्भर है।

क्योंकि 'हटाए जाने' की सरणी को 'नए' ऑपरेटर के एकल उपयोग के साथ बनाया जाना चाहिए था। 'नया' ऑपरेशन को उस जानकारी को ढेर पर रखना चाहिए था। अन्यथा, नए के अतिरिक्त उपयोग कैसे पता चलेगा कि ढेर कहाँ समाप्त होता है?

यह संकलक विशिष्ट होने के लिए C ++ मानक में परिभाषित किया गया है जिसका अर्थ संकलक जादू है यह कम-से-कम एक प्रमुख मंच पर गैर-तुच्छ संरेखण प्रतिबंधों के साथ तोड़ सकता है।

आप समझ सकते हैं कि delete[] को केवल new[] द्वारा दिए गए संकेतकों के लिए परिभाषित किया गया है, जो operator new[] द्वारा लौटाए गए समान संकेतक नहीं हो सकता है operator new[] जंगली में एक कार्यान्वयन operator new[] द्वारा operator new[] द्वारा लौटाए गए पहले इंटरेस्ट में एआरए गणना को संग्रहीत करना है, और new[] एक पॉइंटर ऑफसेट वापस करता है जो कि पिछले है। (यही कारण है कि गैर तुच्छ संरेखण new[] को तोड़ सकते हैं।)

ध्यान रखें कि operator new[]/operator delete[] ! = new[]/delete[]

साथ ही, यह ऑर्थोगोनल है कि सी को malloc द्वारा आवंटित स्मृति का आकार कैसे जानता है।

यह मानकीकृत नहीं है। माइक्रोसॉफ्ट के रनटाइम में नया ऑपरेटर मॉलोक () का उपयोग करता है और डिलीट ऑपरेटर निशुल्क () का उपयोग करता है। इसलिए, इस सेटिंग में आपका प्रश्न निम्न के समतुल्य है: कैसे नि: शुल्क () ब्लॉक का आकार पता है?

दृश्य के पीछे कुछ बहीखाता चल रहा है, अर्थात सी रनटाइम में

यह एक और अधिक रोचक समस्या है जिसे आप पहले से सोच सकते हैं। यह उत्तर एक संभव कार्यान्वयन के बारे में है

सबसे पहले, जबकि आपके सिस्टम को कुछ स्तरों पर पता होना चाहिए कि कैसे 'मुक्त' स्मृति ब्लॉक, अंतर्निहित malloc / मुक्त (जो नया / हटाएं / नया [] / हटाएं [] आमतौर पर कॉल करते हैं) हमेशा याद नहीं रखता कि कितनी मेमोरी आप पूछते हैं, यह गोल हो सकता है (उदाहरण के लिए, एक बार जब आप 4K से ऊपर होते हैं तो यह अक्सर अगले 4 के आकार वाले ब्लॉक तक गोल होता है)।

इसलिए, यहां तक ​​कि अगर स्मृति ब्लॉक का आकार मिल सकता है, तो यह हमें बताता नहीं है कि नई [] एड मेमोरी में कितने मूल्य हैं, क्योंकि यह छोटा हो सकता है। इसलिए, हमें एक अतिरिक्त पूर्णांक को संग्रहीत करना होगा जिससे हमें बताए गए कि कितने मूल्य हैं।

को छोड़कर, यदि निर्माण के प्रकार में कोई नाशक नहीं है, तो हटाना [] को स्मृति ब्लॉक को छोड़कर कुछ भी नहीं करना पड़ेगा, और इसलिए कुछ भी संग्रहीत नहीं है!