ध्यान दें कि सुरक्षा सुविधा के रूप में ओएस द्वारा किए गए शून्य-प्रारंभिकरण को आमतौर पर पहली बार स्मृति आवंटित किया जाता है। इसके द्वारा मेरा मतलब ढेर, ढेर और डेटा खंडों में कोई भी खंड है। ढेर और डेटा अनुभाग आमतौर पर निश्चित आकार के होते हैं, और जब एप्लिकेशन को स्मृति में लोड किया जाता है तब प्रारंभ किया जाता है।
डेटा सेगमेंट (स्थिर/वैश्विक डेटा और कोड युक्त) आमतौर पर "पुनः उपयोग नहीं किया जाता" है, हालांकि यदि आप गतिशील रूप से रनटाइम पर कोड लोड करते हैं तो यह मामला नहीं हो सकता है।
स्टैक सेगमेंट में स्मृति हर समय फिर से उपयोग की जाती है। स्थानीय चर, फ़ंक्शन स्टैक फ़्रेम इत्यादि .. सभी का लगातार उपयोग किया जाता है और फिर से उपयोग किया जाता है और हर बार प्रारंभ नहीं किया जाता है - बस जब एप्लिकेशन को पहले लोड किया जाता है।
हालांकि, जब एप्लिकेशन ढेर मेमोरी के लिए अनुरोध करता है, तो मेमोरी मैनेजर आम तौर पर अनुरोध देने से पहले स्मृति के खंडों को शून्य-प्रारंभ करेगा, लेकिन केवल नए सेगमेंट के लिए। यदि आप ढेर मेमोरी के लिए अनुरोध करते हैं, और पहले से ही शुरू किए गए सेगमेंट में खाली स्थान है, तो प्रारंभिकता दूसरी बार नहीं की जाती है। इसके लिए, इस बात की कोई गारंटी नहीं है कि यदि आपके आवेदन द्वारा स्मृति का उस विशेष खंड का पुन: उपयोग किया जाता है, तो इसे फिर से शून्य-प्रारंभिक प्राप्त किया जाएगा।
तो, उदाहरण के लिए, यदि आप ढेर पर एक फू आवंटित करते हैं, तो अपने क्षेत्र को एक मान निर्दिष्ट करें, Foo इंस्टेंस को हटाएं और फिर ढेर पर एक नया फू बनाएं, एक मौका है कि नया फू आवंटित किया जाएगा पुरानी फू के समान सटीक स्मृति स्थान में, और इसलिए इसके क्षेत्र में प्रारंभिक रूप से पुराने फू के क्षेत्र के समान मूल्य होगा।
यदि आप इसके बारे में सोचते हैं, तो यह समझ में आता है, क्योंकि ओएस केवल एक एप्लिकेशन को किसी अन्य एप्लिकेशन से डेटा तक पहुंचने से रोकने के लिए डेटा प्रारंभ कर रहा है। एप्लिकेशन को अपने डेटा तक पहुंचने में कम जोखिम होता है, इसलिए प्रदर्शन कारणों से प्रारंभिकता हर बार नहीं की जाती है - केवल पहली बार स्मृति के किसी विशेष सेगमेंट को एप्लिकेशन (किसी भी सेगमेंट में) के उपयोग के लिए उपलब्ध कराया जाता है।
कभी-कभी जब आप डीबग मोड में कोई एप्लिकेशन चलाते हैं, हालांकि, कुछ डीबग मोड रनटाइम प्रत्येक आवंटन पर स्टैक और ढेर डेटा प्रारंभ करते हैं (इसलिए आपका फू फ़ील्ड हमेशा प्रारंभ किया जाएगा)। हालांकि, विभिन्न डीबग रनटाइम डेटा को विभिन्न मानों में प्रारंभ करते हैं। कुछ शून्य प्रारंभ होते हैं, और कुछ "मार्कर" मान में प्रारंभ होते हैं।
बिंदु यह है - कभी भी अपने कोड में कहीं भी प्रारंभिक मानों का उपयोग न करें। बिल्कुल कोई गारंटी नहीं है कि वे शून्य शुरू हो जाएंगे। साथ ही, पहले से जुड़े आलेख को माता-पिता और डिफ़ॉल्ट बनाम मूल्य प्रारंभिकरण के बारे में पढ़ना सुनिश्चित करें क्योंकि यह "अनियमित" मान की परिभाषा को प्रभावित करता है।
क्या आप वाकई सी ++ हैं और नहीं, कहें, आपका ऑपरेटिंग सिस्टम? मैं कल्पना करूंगा (लेकिन जांच नहीं की है) कि जब एक ओएस आपकी प्रक्रिया में स्मृति आवंटित करता है, तो कम से कम जब आप स्मृति पृष्ठ को स्पर्श करते हैं तो यह शून्य हो जाएगा। न तो सी और न ही सी ++ को इस व्यवहार की आवश्यकता होती है, लेकिन यदि ओएस आपको स्मृति प्रक्रियाओं को जो भी आखिरी प्रक्रिया में रखता है, तो यह एक बड़ा सुरक्षा छेद होगा। अगर वहां कहें, तो एसएसएच उस भौतिक मेमोरी पेज का उपयोग करने की आखिरी प्रक्रिया थी, वहां लॉगिन जानकारी या निजी कुंजी हो सकती है। –
यह ओएस के आवंटित होने पर स्मृति को शून्य से बाहर रखने के लिए अपमानजनक प्रतीत होता है। – Alan
आप माइकल बुर द्वारा उत्कृष्ट, संबंधित पोस्ट को भी जवाब में पढ़ सकते हैं [टाइप नाम के बाद कोष्ठक नए के साथ अंतर बनाते हैं?] (Http://stackoverflow.com/questions/620137/do-the-parentheses- बाद में टाइप-नाम-मेक-ए-फर्क-इन-न्यू/620402 # 620402) –